JS中所有的function都是一个闭包,不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的闭包。
我们可以把闭包理解为定义在一个函数内的函数。
//错误的代码 function test(nodes){ for(var i=nodes.length-1;i>=0;i--){ nodes[i].onclick=function(){ alert(i); } } }
当点击一个节点时,按照预期,应该弹出节点的序号,但实际弹出的是-1.
函数在执行的时候才初始化活动对象,当第一个函数执行时,i的值已经是-1了。使用立即执行的匿名函数,就会生成一个仅对该函数有效的变量 。
在闭包(这里就是匿名函数)里面定义的函数(这里是指事件处理函数)会「记住」它所处的上下文(这是指匿名函数中所有的变量)环境。
//改正后的代码
//方法1 function test(nodes){ for(var i=nodes.length-1;i>=0;i--){ (function(i){ nodes[i].onclick=function(){ alert(i); } }(i)) } }
//方法2 function test(nodes){ function helper(i){ return function(){ alert(i); } } for(var i=nodes.length-1;i>=0;i--){ nodes[i].onclick=helper(i); } }
扩展阅读:JavaScript中(function(){…})(); 与 (function(){…}()); 这两种写法在意义上有什么区别?