簡體   English   中英

傳遞給Array.prototype.every的函數中的“可變變量可從閉包訪問”

[英]“Mutable variable is accessible from closure” in a function passed to Array.prototype.every

代碼會比我說得更清楚:

var candidateIndex = 0;
var minValue = Number.MAX_VALUE;
topArray.every(function(element, index) {
    if (element.innerArray && element.innerArray.length < minValue) {
        minValue = element.innerArray.length;
        candidateIndex = index;
        if (minValue == 0) {
            return false;
        }
    }
    return true;
});

// ... use minValue and candidateIndex

什么這是做正經歷topArray ,並發現,要么陣列,其具有的第一構件innerArray長度為0,否則尋找具有最小長度的一個innerArray 它工作正常,但是我已經准確地報告了檢查器“可從閉包訪問可變變量”。

我看到這通常是一件壞事,尤其是對於異步代碼。 我已經仔細研究了如何避免從閉包中 訪問可變變量以及如何 在事件閉包中訪問可變變量 ,並了解到在這種情況下,匿名函數是異步的,並且最好在當時存儲可變變量的狀態,但就我而言,我希望我調用的同步匿名函數來更改變量。

在這種情況下,我得到的警告是錯誤的,我應該忽略它,對嗎? 除了使用for循環而不是every ,還有什么方法可以在沒有警告發生的情況下獲得我想要的功能?

更新:就其價值而言,警告似乎確實來自我的WebStorm IDE本身,而不是任何分析工具插件。

從上面的評論中確認此警告基本上是誤報后,我修改了代碼以忽略警告消息:

topArray.every(function(element, index) {
    //noinspection JSReferencingMutableVariableFromClosure
    if (element.innerArray && element.innerArray.length < minValue) {
        minValue = element.innerArray.length;
        candidateIndex = index;
        //noinspection JSReferencingMutableVariableFromClosure
        if (minValue == 0) {
            return false;
        }
    }
    return true;
});

(警告僅在比較值時觸發,而不是在設置時觸發。)

我很想聽聽其他答案,但如果沒有,我會在大約一周內接受這個答案。

暫無
暫無

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

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