可以从闭包中访问JS Mutable Variable

时间:2015-07-01 10:18:58

标签: javascript jquery

所以我在我的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;
    });
}

2 个答案:

答案 0 :(得分:7)

为什么会收到警告

正如@RGraham在评论中提到的那样,js编译器假设$.grep()的第二个参数是一个回调函数,并且是异步执行的(至少这是语法) 。然而这不正确,因为第二个功能实际上是一个过滤功能。请参阅API docs

通常会收到警告Mutable Variable is accessible from closure 在for循环中使用async函数。那是因为整个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;
       });
   })();
}

答案 1 :(得分:4)

它警告您{gre}&#34; callback&#34;之前可以修改level。得到它 - 当然,IDE并不知道$.grep没有进行回调,而是过滤功能。 (请注意,采用回调的异步函数通常具有相同的签名)

如果 是异步回调函数,那么当读取level的值时,它会在foor循环的最后一次迭代中找到最后设置的值 - 并且不是调度电话时出现的值,这会导致问题 - 因此(请注意,通常非常有用)警告。