js中闭包的一些理解

来源:互联网 发布:药品数据库 编辑:程序博客网 时间:2024/06/06 01:05

最近在学js,遇到关于闭包的使用,查阅一些资料结合写的一些测试,下面是一些自己的理解!!!

    一. 闭包的概念是比较抽象的,先从闭包的用途说起

       1.读取函数内部的变量。

           这点很好理解,在js中函数内部的变量定义通常都是使用var定义成局部变量,不推荐大量使用全局变量。那么这时,想要在函数体A外读取A里的变量,就变   得困难,因为根据js的GC,函数A执行完后就会被回收,因此里面的变量也就无法读取。这时候,使用闭包,就能解决这样的问题。举个例子:这样便实现了在            函数外读取A里的变量 。

         

function A(){var me="I am a temp";this.dealTemp=function(){return me;}}var a=new A();<span style="white-space:pre"></span>alert(a.dealTemp());
                

 2.让函数里的变量保存在内存中。

这个也不难理解,只要在外部调用A里面的dealTemp的方法,me这个变量就会一直在内存当中,举个例子就很好理解了。

function wai(){<span style="white-space:pre"></span>var mk=0;this.li=function(){<span style="white-space:pre"></span>return mk++;}}var mm=new wai();alert(mm.li());//输出的结果是0;alert(mm.li());//输出的结果是1 这说明mk这个变量一直在内存当中
              
             小结:归结起来闭包做了3件事:

1.保护了函数内部的变量安全

                2.在内存中维持一个变量

                3.可以在函数内部建立私有的属性和方法(只能通过内部的方法来访问变量)

                基于这3点在js的开发中就能解决很多细节和变量作用域带来的许多问题。


          二. js垃圾回收机制

1.当一个对象不再被引用的时候,这个对象就会被GC回收。

2.如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。

               再回过头看看第一个例子A和dealTemp相互引用,但是dealTemp又在A外被引用,这就解释了为毛A执行完后,没有被回收。


       未完待续。。。。。


        

0 0
原创粉丝点击