可以从闭包中访问JS Mutable Variable

Mig*_*and 12 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;
    });
}
Run Code Online (Sandbox Code Playgroud)

nal*_*inc 8

你为什么收到警告?

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

在for循环中Mutable Variable is accessible from closure使用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;
       });
   })();
}
Run Code Online (Sandbox Code Playgroud)


dol*_*ldt 4

它警告您level在 grep“回调”到达之前可以对其进行修改 - 当然,IDE 不知道它$.grep不采用回调,而是采用过滤函数。(请注意,采用回调的异步函数通常具有相同的签名)

如果它一个异步回调函数,那么在读取 的值时level,它将找到最后设置的值 - 在 foo 循环的最后一次迭代中,而不是分派调用时存在的值,这会导致问题 -因此(请注意,通常非常有用)警告。