为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2022-07-21 21:20:55
所以我在审查期间遇到了这段代码:        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 中是否存在错误?如果是前者,我应该如何修复代码?如果是后者,这个警告是否正确(所以我们应该留下禁用评论)或者我应该将检查严重性更改为从不显示这个警告?更新对代码的以下更改使警告消失:        $.each(permissions, function (i, permission) {            $.each(permission.toJSON(), function (key, value) {                data.push({                    name: "Permissions[" + i + "]." + key,                    value: value                });            });        });不过,当两个代码片段的行为相同时,我仍然想知道为什么会出现警告。
查看完整描述

1 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

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


请注意,您找到的文章是指 C#,它建议的修复仅对 C# 有效。在 JS 中你不能通过 using 来解决问题var i1 = i,因为i1声明的变量var会有一个函数作用域,而你需要它有一个块作用域。因此,如果您可以使用 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

        });

    });

}


查看完整回答
反对 回复 2022-07-21
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号