关于闭包

这两天在苦苦钻研闭包,因为之前对闭包的接触并不多,于是大量在网上找资料。怕遗忘,登陆博客,记录下来。

什么是闭包,记得刚学习JS的时候,说闭包就是外部调用内部函数的变量。楼主当时比较浮躁,就以为是个很简单的东西,也就没有深究,但是随着,写的代码多了,感觉闭包真的非常有用。到目前为止,用的最后就是匿名函数自调用。

首先看我的两个案例,作用域和执行顺序。

<script>
     for (var i=0; i < 10; i++) {
           function aa(){
               alert(i);
           }
     };
     aa();//10


     for (var i=0; i < 10; i++) {
           function aa(){
               alert(i);
           }
            aa();//1...9
     };
     
</script>

第一个弹出的是10,for循环执行完了,才调用函数aa(),这个时候i刚好等于10,于是alert(i)这个i引用了此时的i=10;

第二个我们大家都知道,弹出的1...9,因为一边循环一边执行,这个我们应该都理解.第二个函数等同于下面这个匿名自调用函数.

 for (var i = 0; i < 10; i++) {
           (function(j){
             alert(j)
           })(i)
    };

 其实上面这个已经叫做闭包了。

 我自己的理解什么是闭包:能够让外部函数访问内部函数变量的过程叫做闭包。

一般我们都是到外部函数是访问不了内部函数的。要访问我们只能通过闭包来访问,也就是返回内部函数。

看下面这个:

   var aa=99;
      function f1(){
          alert(aa);
      }
      alert(aa);//99
    
      function f2(){
         var bb=99;
      }
      alert(bb);//error;

      function f3(){
          cc=88;
      }
      f3();
      alert(cc);//88
定义了全局变量aa等于99,按照作用域的访问范围内部函数(访问)——外部——父级函数的规则(大家都叫链式作用域)。所有函数都可以访问aa;(说到这里其实我们所有的函数都是window对象下面的闭包,因为window是所有函数的父级);

f1()执行后弹出了99;

f2()执行后是个错误,因为在外部调用内部变量bb;

f3()返回88,因为我没有用var声明,执行f3执行,让cc变成了全局变量,外部的都可以访问;

如何让外部函数访问内部函数的变量呢?就是在函数里面再定义一个内部函数,然后返回就行了;

      function f1(){
           var aa=99;
           var f2=function(){
               return function(){
                    return aa;
             }();
         };
             return f2();
      }
      alert(f1());
 这样外部函数就调用到了aa;这个时候其实内存并没有清除aa;因为闭包可以保存一些变量的值。

      function f1(){
           var aa=99;
           aadd=function(){aa+=1};
           var f2=function(){
               return function(){
                    window.alert(aa);
             }();
         };
              return f2;//返回函数体
      }
     var result=f1(); //引用F1函数 注意了这个时候f2等于被全局变量引用了,引发了内存一直保存着值;
         result(); //执行f1 99
         aadd(); //执行全局变量函数aadd;aa一直都保存在内存里面。
         result();//在执行f1  100

闭包差不多是这些了。下面来看看网上找的例子吧。

  var name="The Window";
       var object={
             name:"kack",
             packname:function(){
              return function(){
                      return  this.name; 
                }

             }
       }
       alert(object.packname()());


      var name="The Window";
       var object={
             name:"kack",
             packname:function(){
                var that=this;
              return function(){
                      return  that.name; 
                }

             }
       }
       alert(object.packname()());

这个两个也是闭包,只不过多了个this指针的问题。一个是window,一个是object.所以答案一个是ths window。一个是kack;最后面我把函数给执行,内存释放了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值