js里的闭包

一、闭包的特性

  1、函数嵌套函数

  2、函数内部可以引用外部的参数和变量

  3、参数和变量不会被垃圾回收机制回收

二、闭包的定义及优缺点

官方定义:闭包是指有权访问另一个函数作用域中的函数,创建闭包的最常见方式就是在一个函数里创建另一个函数,通过另一个函数来访问这个函数的局部变量。

自己理解:闭包就是函数里面嵌套函数,里面函数可以访问外面函数的变量(作用域链)

闭包缺点:常驻内存,增大了内存的使用量,造成内存泄漏

闭包应用目的:为了设计私有的方法和变量

  

 1         function aaa() {  
 2           var a = 1;  
 3           return function(){   //匿名函数作为返回值传给aaa(),因此执行aaa()就是执行匿名函数
 4            alert(a++)
 5           };  
 6         }         
 7         var fun = aaa();  
 8         fun();// 1 执行后 a++,,然后a还在~  
 9         fun();// 2   
10         fun = null;//a被回收!!

由上面的例子可以看出,变量始终保存在内存中,如果不当使用会增大内存损耗

 

三、闭包里的this对象

在闭包里面使用this可能会导致一些问题,this对象是运行时基于函数的执行环境绑定的。如果this在全局范围就是指向window,如果在对象内部就指向这个对象。而闭包却在运行时是指向windowde .

 1         var name ="window";
 2         var person = {    
 3           name : "Leon",    
 4           age:22,    
 5           say:function(){    
 6             return function(){
 7               return this.name;    
 8             }    
 9           }        
10         }    
11         console.info(person.say()()); //控制台输出:window

要想让this不指向window,可以在say()方法里面将this赋值给一个临时变量。

 1         var name ="window";
 2         var person = {    
 3           name : "Leon",    
 4           age:22,    
 5           say:function(){
 6               var _this=this;
 7             return function(){
 8               return _this.name;    
 9             }    
10           }        
11         }    
12         console.info(person.say()()); //控制台输出:Leon

 

posted @ 2018-02-04 17:54  endlessmy  阅读(152)  评论(0编辑  收藏  举报