带有闭包的 JavaScript For 循环导致 JSLint 警告

Posted

技术标签:

【中文标题】带有闭包的 JavaScript For 循环导致 JSLint 警告【英文标题】:JavaScript For Loop with Closure Causing JSLint Warning 【发布时间】:2018-09-30 06:23:34 【问题描述】:

我正在编写一个 javascript 脚本,它使用 for 循环将 onclick 事件分配给一系列按钮。为了解决 i 范围的问题,我使用以下示例作为我的 for 循环的基础,基于 this answer。我希望我知道这种创建 for 循环的方法的名称,如果有的话。

for (var i = 0; i < 10; i++) (function(i)
    //some code
)(i);

当我通过 JSLint 和 JSHint 运行我的代码时,它会给出一个警告:“不要在循环中创建函数。”参考上面构建的两个 for 循环。我看到的关于这个警告的问题没有使用我正在使用的格式的循环,所以我不知道它们如何适用于此。

为什么会给出这个警告,还有比这更好的方法吗?此外,这种 for 循环格式是否有名称(最后一部分可以在 cmets 中回答)?如果这与其他问题有关,为什么这种格式有效?

【问题讨论】:

如果我能弄清楚这个 for 循环格式的名称,我也许可以更好地写出问题标题 这叫做closure。 【参考方案1】:

这只是创建closureimmediately invoking function expressiononclick 事件将在未来某个时间发生,但到那时循环已完成执行,i 的值将更新为 i&lt;10 的最后一个值

所以在这种closureIIFE 的情况下,i 的值将被绑定并保留在范围内。

另一种方法是使用let 而不是var

for (let i = 0; i < 10; i++)
  // rest of the code

let 的范围总是在块级

【讨论】:

以上是关于带有闭包的 JavaScript For 循环导致 JSLint 警告的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript之全选/反选/取消,for循环闭包

循环和闭包。 For 和 Var

JavaScript---循环与闭包

js中闭包for循环

js中for循环闭包问题记录

从Javascript闭包访问循环中的外部变量[重复]