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

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))

是在做。

请注意,您的示例遗漏了一个重要部分:立即函数必须返回另一个函数,该函数将是 click 处理程序:
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);
}

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

10-12 17:09
查看更多