理解js中的闭包

来源:互联网 发布:.games域名 编辑:程序博客网 时间:2024/03/29 02:33

       闭包在红宝书中的定义是:  有权访问另外一个函数作用域中的变量的函数。  而我们实际使用时,这个另外一个函数往往是闭包函数的父函数,即我们在一个函数里面创建另外一个函数,并调用父函数中的变量。

      看下面的例子:

      function add(){

          var i = 0;

          return function(){

            alert(i++);

}

}  

     var f = add();

     f();


      我们先要有一个知识就是每个函数在执行前都要初始化自己的作用环境,从最大的全局环境来看,全局环境中有一个名叫add的函数,还有一个名为f的var变量,其outer指针指向外面,为null。初识化add环境的时候,add函数里面有i,这个i是undefined,outre指针指向外面的全局环境,返回值是另一个匿名函数,接下来开始执行add中的语句,并且把i的值赋值为1,然后初识化匿名函数的执行环境,由于是匿名函数,所以scope属性中有一个指向add的指针,至此,已经有两个指针了,即add指向全局环境,匿名函数指向add,add函数执行完了,返回这个匿名函数,并把它复制给全局环境中的f变量,至此。第三条指针就是全局环境中的f变量指向那个匿名函数。从而形成了一个闭环。然后开始执行f函数,这个f函数的outer指针指向add,然后匿名函数里面没有其他的变量了。这个过程的图可以参见下面这样:











     这里正好也涉及到了一个闭包的特性,正常来说对于一个函数中的局部变量,当函数执行完了以后这个变量也就应该消失了,但是这里的i没有,知道最后面执行f语句的时候,i还是可以用的,所以alert出来的结果是2,正好这也是闭包的第一个特点: 保存现场。

   


0 0
原创粉丝点击