簡體   English   中英

關於 ClosureOnModifiedVariable 的 ReSharper 警告 - 為什么?

[英]ReSharper warning about ClosureOnModifiedVariable - why?

所以我在審查期間遇到了這段代碼:

        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

但是,我嘗試刪除評論,然后按照該鏈接所述進行操作,在 scope 內部創建一個變量來存儲該值,但警告並沒有 go 消失。

此外,盡管有警告,但它的行為似乎符合設計 - 'i' 的值正確更改,最后,'data' 變量存儲正確/預期的值。

所以,我的問題是......為什么 ReSharper 會對此發出警告? 代碼中是否存在實際問題,或者 ReSharper 中是否存在錯誤? 如果是前者,我應該如何修復代碼? 如果是后者,這個警告正確的(所以我們應該留下禁用評論)還是應該將檢查嚴重性更改為從不顯示這個警告?

更新

對代碼的以下更改使警告 go 消失:

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

不過,當兩個代碼片段的行為相同時,我仍然想知道為什么會出現警告。

只有在變量修改后執行 lambda(在您的情況下為函數參數)時,才能訪問修改后的閉包。 在您的情況下, $.each應該立即執行 lambda ,所以它應該不是問題。 但是 ReSharper 不知道被調用的 function 是否會立即執行傳遞的 lambda 或將其存儲以供以后執行,尤其是在具有動態類型的 JavaScript 中。 所以它總是給出警告。

請注意,您找到的文章是指 C#,它建議的修復僅對 C# 有效。 您無法通過使用var i1 = i來修復 JS 中的問題,因為由var聲明的變量i1將具有 function scope,並且您需要它具有塊 Z31A1FD140BE4BEF2D51E121EC9A1。 因此,如果您可以使用 ECMAScript 2015,那么您可以使用letconst來聲明一個帶有塊 scope 的變量,例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM