2015-07-01 71 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; 
     }); 
    })(); 
}