Javascript 关于ClosureOnModifiedVariable的ReSharper警告-为什么?

Javascript 关于ClosureOnModifiedVariable的ReSharper警告-为什么?,javascript,scope,warnings,resharper,Javascript,Scope,Warnings,Resharper,因此,我在一次审查中发现了以下代码: var permissions = $("#" + me.map.permissionsGridHtmlId).data("kendoGrid").dataSource.data(); var data = form.serializeArray(); for (var i = 0; i < permissions.length; i++) { var record = permi

因此,我在一次审查中发现了以下代码:

        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
                });
            });
        }

不过,我仍然想知道,当两个代码段的行为相同时,为什么会出现警告。

只有在修改变量后执行lambda(在您的情况下是函数参数)时,访问修改的闭包才是一个问题。在您的例子中,
$。每个
都应该立即执行lambda,所以这不应该是一个问题。但是ReSharper不知道被调用函数是否会立即执行传递的lambda,或者是否会存储它以供以后执行,特别是在JavaScript中的动态类型中。所以它总是发出警告

请注意,您找到的文章引用了C#,它建议的修复仅对C#有效。您无法通过使用
var i1=i
修复JS中的问题,因为
var
声明的变量
i1
将具有函数作用域,您需要它具有块作用域。因此,如果您可以使用ECMAScript 2015,那么您可以使用
let
const
来声明具有块范围的变量,例如:

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();
    let i1 = i;
    $.each(record, function (key, value) {
        data.push({
            name: "Permissions[" + i1 + "]." + key,
            value: value
        });
    });
}
var permissions=$(“#”+me.map.permissionsGridHtmlId.data(“kendoGrid”).dataSource.data();
var data=form.serializeArray();
for(var i=0;i
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();
    let i1 = i;
    $.each(record, function (key, value) {
        data.push({
            name: "Permissions[" + i1 + "]." + key,
            value: value
        });
    });
}