Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS可变变量可从闭包访问_Javascript_Jquery - Fatal编程技术网

Javascript 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/, "")) ==

所以我的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;
    });
}
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!请把标题和文章分开。您不需要阅读标题就能理解。希望您已经讨论了如何正确地将值传递到异步回调中。