2015-07-01 67 views
8

訪問,所以我在我的JS編譯器中有一個警告,但是能否向我解釋這是否會影響我的代碼執行的方式?JS可變變量可以從閉包

for (x = 0; x < levels.length; x++) { 
    var level = levels[x]; 
    var candlesOnLevel = $.grep(relevantCandles, function(candles, index) { 
     return parseInt($(candles).css("top").replace(/px/, "")) === level; 
    }); 
} 
+1

你得到的警告是什麼? – Tushar

+1

你的代碼很好。編譯器假定傳遞給'$ .grep'的回調是異步的,但事實並非如此。 – CodingIntrigue

+0

警告只是「可變的變量是可以從閉包訪問」,ty雖然答案! –

回答

4

它警告你,level可以在此之前,grep的「回調」得到它被修改 - 當然,IDE不知道$.grep並不需要回調,但一個過濾功能。閱讀level的值時(請注意採取回調異步函數通常具有相同的簽名)

如果異步回調函數,那麼,這將最後一組發現的價值存在 - 在最後一次迭代而不是當您發出呼叫時存在的價值,這會導致問題 - 因此(請注意,通常非常有用)警告。

+0

希望您瞭解瞭如何正確將值傳遞給異步回調。 – IronSean

5

爲什麼你得到

由於@RGraham在評論中提到的,JS編譯器假定到$.grep()秒參數是一個回調函數的警告,被異步執行(這ATLEAST是什麼樣子,句法)。但那不是真的,因爲第二個功能實際上是過濾功能。請參閱API docs

當在for循環中使用async函數時,通常會得到Mutable Variable is accessible from closure的警告 。那是因爲整個for loop都有一個範圍。這意味着在每次迭代中,最終都會捕獲相同的變量。所以回調會得到錯誤的ID,因爲level(可變)將在調用回調之前更改。幸運的是,那不是你正在處理(因爲$ .grep不是異步):)的情況下

...你能不能給我解釋一下這是否會實際影響我的代碼 將執行的方式嗎?

不,這樣的警告不會影響你的代碼的結果。

您可以簡單地忽略該警告,但如果您仍想避免這種情況,可以將內容放入閉包中。

for (x = 0; x < levels.length; x++) { 
    (function(){ 
     var level = levels[x]; 
     var candlesOnLevel = $.grep(relevantCandles, function(candles, index) { 
      return parseInt($(candles).css("top").replace(/px/, "")) === level; 
     }); 
    })(); 
}