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

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...