有关ClosureOnModifiedVariable的重新共享警告-为什么?

问题描述 投票:0回答:1

所以我在审查中遇到了这段代码:

        var permissions = $("#" + me.map.permissionsGridHtmlId).data("kendoGrid").dataSource.data();
        var data = form.serializeArray();
        for (var i = 0; i < permissions.length; i++) {
            var record = permissions[i].toJSON();
            $.each(record, function (key, value) {
                data.push({
                    // ReSharper disable once ClosureOnModifiedVariable
                    name: "Permissions[" + i + "]." + key,
                    value: value
                });
            });
        }

并且那个'// ReSharper disable'注释使我停顿了。我试图调查一下,发现了-https://www.jetbrains.com/help/resharper/AccessToForEachVariableInClosure.html

但是,我试图删除注释,然后按照该链接所述进行操作,在作用域内创建一个变量来存储值,但警告没有消失。

此外,尽管有警告,但它的行为似乎像设计的一样-'i'的值正确更改,最后'data'变量存储正确/期望的值。

所以,我的问题是...为什么ReSharper为此警告?代码中是否存在实际问题,还是ReSharper中存在错误?如果是前者,我应该如何修复代码?如果是后者,此警告ever是否正确(因此我们应该保留禁用注释),或者我应该将检查严重性更改为从不显示此警告?

更新

对代码的以下更改使警告消失了:

        $.each(permissions, function (i, permission) {
            $.each(permission.toJSON(), function (key, value) {
                data.push({
                    name: "Permissions[" + i + "]." + key,
                    value: value
                });
            });
        });

但是,当两个代码片段看上去表现相同时,警告仍然存在。

所以我在审查中遇到了这段代码:var权限= $(“#” + me.map.permissionsGridHtmlId).data(“ kendoGrid”)。dataSource.data(); var data = form.serializeArray();为(...
javascript scope warnings resharper
1个回答
0
投票
仅当在修改变量之后执行lambda(您的情况下的函数参数)时,才可以访问修改的闭包。在您的情况下,$.each应该立即执行lambda,所以这不是问题。但是ReSharper并不知道被调用函数是否会立即执行传递的lambda或将其存储以供以后执行,尤其是在具有动态类型的JavaScript中。因此,它始终会发出警告。
© www.soinside.com 2019 - 2024. All rights reserved.