JavaScript 闭包

Posted MyZone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript 闭包相关的知识,希望对你有一定的参考价值。

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(){…}()); 这两种写法在意义上有什么区别?

 

以上是关于JavaScript 闭包的主要内容,如果未能解决你的问题,请参考以下文章

Spark闭包与序列化

JavaScript ---- 闭包(什么是闭包,为什么使用闭包,闭包的作用)

JavaScript 闭包(随笔)

javascript中的闭包

Javascript中的闭包

Javascript中的闭包(转载)