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