可以从闭包中访问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循环的最后一次迭代中找到最后设置的值,而不是调度调用时出现的值,这会导致问题- 因此(注意你,通常非常有用)警告。