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