javascript - 请解释闭包,或将循环计数器绑定(bind)到函数范围

标签 javascript function loops closures

我见过程序员使用计数器在循环内分配事件监听器。我相信这是语法:

for(var i=0; i < someArray.length; i++){
   someArray[i].onclick = (function(i){/* Some code using i */})(i);
}

谁能解释一下这背后的逻辑,以及这种奇怪的语法,我从未见过:

(function(i))(i);

非常感谢您的时间和耐心。

最佳答案

(function(i))(i) 语法创建一个匿名函数,然后立即执行它。

通常你会这样做以在每次循环时创建一个新函数,它有自己的变量副本,而不是每个事件处理程序共享同一个变量。

例如:

for(int i = 0; i < 10; i++)
    buttons[i].click = function() { doFoo(i); };

经常把人抓出来,因为无论你点击什么按钮,doFoo(10) 都会被调用。

鉴于:

for(int i = 0; i < 10; i++)
    buttons[i].click = (function(i){ return function() { doFoo(i); };)(i);

为每次迭代创建一个内部函数的新实例(具有自己的 i 值),并按预期工作。

关于javascript - 请解释闭包,或将循环计数器绑定(bind)到函数范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4776792/

相关文章:

javascript - Angular 中数组中的数组

JavaScript 帮助 : Creating a Study Game - Matching & Fill in the Blank

javascript - D3 v4 中的方格退出选择

php - 在PHP中的函数中加载全局变量

JavaScript:使用Reduce()构造一个比较输入数组的函数交集;仅返回相交元素

javascript - 从对象数组中删除最后一个对象。

c++ - 用相同的值填充数组,循环重置值

javascript - 1 个模块的 ui-view 从另一个模块复制内容

c - 将结构发送到 C 中的函数

java - 尝试创建一个循环,在添加错误值时要求更正