我见过程序员使用计数器在循环中分配事件监听器.我相信这是语法:
for(var i=0; i < someArray.length; i++){ someArray[i].onclick = (function(i){/* Some code using i */})(i); }
有人可以解释这背后的逻辑,这个奇怪的语法,我从来没有见过这个:
(function(i))(i);
非常感谢您的时间和耐心.
解决方法
这样做是因为JavaScript只有函数作用域,而不是块作用域.因此,您在循环中声明的每个变量都在函数的作用域中,并且您创建的每个闭包都可以访问同一个变量.
(function(i){/* Some code using i */}(i))
是在做.
请注意,您的示例错过了一个重要部分:立即函数必须返回另一个函数,它将是单击处理程序:
someArray[i].onclick = (function(i){ return function() { /* Some code using i */ } }(i));
直接的功能并不特别.它以某种方式内联函数定义和函数调用.您可以通过正常的函数调用替换它:
function getClickHandler(i) { return function() { /* Some code using i */ } } for(var i=0; i < someArray.length; i++){ someArray[i].onclick = getClickHandler(i); }