我见过程序员使用计数器在循环内分配事件监听器。我相信这是语法:
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/