亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于 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 關注
  • 84 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號