javascript - JS 可变变量可以从闭包中访问

标签 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;
    });
}

最佳答案

为什么会收到警告

正如@RGraham 在评论中提到的,js 编译器假设 $.grep() 的第二个参数是一个回调函数,并且正在异步执行(至少它看起来像这样 语法上)。然而,事实并非如此,因为第二个函数实际上是一个过滤函数。查看API docs

通常会收到警告 Mutable Variable is accessible from closure 当 在 for 循环中使用 async 函数。那是因为整个 for 循环 只有一个作用域。这意味着在每次迭代中,您最终都会捕获相同的变量。所以回调会得到错误的 id,因为 level(可变的)会在调用回调之前改变。幸运的是,您正在处理的情况并非如此(因为 $.grep 不是异步的):)

...could you explain to me if this will actually affect the way my code will execute?

不,这样的警告不会影响您的代码的结果。

您可以简单地忽略该警告,但如果您仍然想避免这种情况,您可以将内容放入闭包中。

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;
       });
   })();
}

关于javascript - JS 可变变量可以从闭包中访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31158593/

相关文章:

javascript - 按标签名称查找下一个元素

javascript - woo_add_cart_fee 不起作用

javascript - jquery 使用单选按钮和复选框切换数组列表

jquery - MVC 4 中使用 jQuery 表单提交的部分 View 和模型

javascript - 我可以关注动态加载的 AJAX 元素吗?

javascript - 如何在不重新加载页面的情况下更改src

javascript - lightbox2 图片库根本不起作用

javascript - 比较两个数组中的多个对象

javascript - 如何更新 jQuery 的 .data() 存储的 "complex"数据?

JQuery 对话框和 Safari