js闭包和函数自调

最近在学js,学到闭包,有一点点没顺的过来,百度了一下,大致理解的一点点,现在就来记录一下。


js没有c++中class的public和private的区分(ES5中),只有全局变量和局部变量这两种,引入闭包就使得js有了私有变量这一概念。
下面给出闭包的定义:闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。调用完一次后,函数没有被释放,整条作用域链上的局部变量都将得到保留。
在本质上,闭包就是将函数内部和函数外部连接的一座桥梁。
写一个闭包的简单例子:

function test() {  

          var a = 1;  

          return function(){

           alert(a++)

          };  

        }        

        var fun = test();  

        fun();// 1 执行后 a++,,然后a还在

        fun();// 2  

闭包有什么好处呢?

1.希望一个变量长期驻扎在内存中

2.避免全局变量的污染

3.私有成员的存在

我们使用全局变量也可以实现同样的效果

var a = 1;

function abc(){

        a++;

        alert(a);

}

abc();              //2

abc();            //3

但是这样全局变量会变得很多很杂,对代码的书写不利

如果我们用局部变量来写的话 会遇到如下问题

function abc(){

        var a = 1;

        a++;

        alert(a);

}

abc();                       //2

abc();                    //2

他的值没有递增
这时候我们就用到刚开始所说的闭包

function test() {  

          var a = 1;  

          return function(){

           alert(a++)

          };  

        }        

        var fun = test();  

        fun();// 1 执行后 a++,,然后a还在

        fun();// 2  

当然,也可以通过函数自调来实现

var fun = (function() {  

          var a = 1;  

          return function(){

           return a++

          };  

        })();
fun();              //1
    
fun();            //2

简单的说就是通过一个”()”来将这个声明变成一个表达式,然后通过()直接调用前面的表达式。自我调用函数只执行一次。设置a为 1。并返回函数表达式。


下面让我们举一个实例:

<script type="text/javascript">

function box(){

     var age = 100;

     return function(){          //匿名函数

          age++;

          return age;

     };

    

}

var b = box();

alert(b());    //101

alert(b());    //102

alert(b());     //103

alert(b);            //     function () {

                        //   age++;

                       // return age;

                      //       }

 

b = null;  //解除引用,等待垃圾回收

</script>

alert(b());相当于alert(box()()); 通过alert(b)我们可以看到b表示函数box()的内嵌function 所以b()也就是box()()调用了这个内嵌函数。
简单的说,在执行b()时,就自动在box()这个函数中在执行,并且执行完后,局部变量age并没有消失,而是依然存在着,所以再次b()后age得到了递增。
最后当我们不需要引用的时候直接b = null就可以了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值