Javascript JS可变变量可从闭包访问
所以我的JS编译器中有一个警告,但是你能解释一下这是否会影响代码的执行方式吗Javascript JS可变变量可从闭包访问,javascript,jquery,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/, "")) ==
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;
});
}
for(x=0;x
它警告您可以在grep“回调”到达之前修改级别
——当然,IDE不知道$。grep
不接受回调,而是一个过滤函数。(请注意,接受回调的异步函数通常具有相同的签名)
如果它是一个异步回调函数,那么在读取
级别的值时,它会找到上次设置的值-在foor循环的最后一次迭代中,而不是在调度调用时出现的值,这会导致问题-因此(请注意,通常非常有用)警告。您为什么会收到警告
正如注释中提到的@RGraham,js编译器假设$.grep()
的第二个参数是回调函数,并且异步执行(至少在语法上是这样)。但是这不是真的,因为第二个函数实际上是一个过滤函数。见
通常会收到警告当
在for循环中使用async
函数。这是因为整个for循环
只有一个作用域。这意味着在每次迭代中,您最终将捕获相同的变量。因此,回调将获得错误的ID,因为在调用回调之前,级别(可变)将被更改。幸运的是,您正在处理的不是这种情况(因为$.grep不是异步的):)
…你能解释一下这是否会影响我的代码吗
会执行吗
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;
});
}
不,这样的警告不会影响代码的结果
您可以简单地忽略警告,但是如果您仍然想避免这种情况,可以将内容放在闭包中
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;
});
})();
}
for(x=0;x
您收到的警告是什么?您的代码没有问题。编译器假设传入$的回调是异步的,但不是。警告是“可变变量可以从闭包访问”,不过答案是ty!请把标题和文章分开。您不需要阅读标题就能理解。希望您已经讨论了如何正确地将值传递到异步回调中。