[英]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,那么您可以使用let
或const
來聲明一個帶有塊 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.