gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:55:04 24 4
gpt4 key购买 nike

所以我在审查过程中发现了这段代码:

        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禁用”评论让我停了下来。我试图调查它,发现了这个 - https://www.jetbrains.com/help/resharper/AccessToForEachVariableInClosure.html

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

此外,尽管有警告,它的行为似乎与设计一致 - “i”的值正确更改,并且最后“data”变量存储正确/预期的值。

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

更新

对代码进行以下更改使警告消失:

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

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

最佳答案

只有在变量修改后执行 lambda(在您的情况下为函数参数)时,访问修改后的闭包才会成为问题。在你的情况下, $.each 应该立即执行 lambda,所以这应该不是问题。但 ReSharper 不知道被调用的函数是否会立即执行传递的 lambda,或者是否会存储它以供以后执行,尤其是在具有动态类型的 JavaScript 中。所以它总是给出警告。

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

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

关于javascript - ReSharper 关于 ClosureOnModifiedVariable 的警告 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61506999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com