可以从闭包中访问JS Mutable变量

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

你为什么收到警告?

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

人们通常会在for循环中使用async函数时Mutable Variable is accessible from closure获取警告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; }); })(); } 

它警告你,在grep“回调”到达之前可以修改level – 当然,IDE不知道$.grep不会接受回调,而是一个过滤函数。 (注意,采用回调的异步函数通常具有相同的签名)

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