理解js中的闭包

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

      看下面的例子:

      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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值