困扰着我的Javascript首先,要理解闭包,首先要理解scope作用域。在js中,scope作用域是按功能划分的。所有属于全局范围的变量都是窗口对象的属性(原型);函数A(){变量数=2;函数B(){console.log(num);}}//B函数可以访问A函数,A函数中定义的变量不能在A函数外访问,所以B函数可以访问A函数中定义的变量;//那么就可以把B函数作为返回值,然后提供给外部(作为接口),那么外部就可以访问A函数中的变量了//chainscopechainscope:childobjectsgotothe父对象逐级查找变量varnum=2;varobj={num:3,getNum:function(){console.log(this.num)}}obj.getNum();//3varn=2;varobj={n:3,getNum:function(){setTimeout(console.log(this.n),3000);}}obj.getNum();//3varn=2;varobj={n:3,getNum:funciton(){setTimeout(function(){console.log(this.n)},3000)}};obj.getNum();//2、closure闭包:内层函数可以引用外层函数中的变量,即使外层的执行已经终止//闭包的典型案例,实现对变量的访问在functionfunctionpeople(){varname="maoguotao";内函数getname(){console.log(名称);}返回获取名称;}varperson=people();人();函数getName是people函数的外部接口,提供对内部定义名称的访问,所以由getName函数和变量名组成的环境称为闭包;闭包的两部分特点:1.可以访问函数内部的变量。2.这些变量的值一直保存在内存中。1.可以访问函数内部的变量functio。nA(){varname="毛果桃";this.getName=function(){console.log(名称);}}vara=newA();a.getName();2.这些变量的值总是保存在内存中functionA(){varname="maoguotao";addName=function(){name=name+"12";}functiongetName(){console.log(name+"34");}returngetName;}vara=A();a();//maoguotao34addName();a();//maoguotao1234a函数执行了两次,也就是说闭包getName函数执行了两次,实际上局部变量名是保存在内存中的在第一次a()调用后并没有被清除,因为A函数是getName闭包函数的父函数,getName函数赋值给了a全局变量,所以getName函数一直在内存中,getName函数依赖于A函数,所以A函数也在内存中,调用结束后不会被清除;闭包的缺点:1、闭包使得函数中的变量存放在内存中,消耗大量内存。不能滥用,会造成网页性能问题,在IE中可能会造成内存泄漏。解决方法是在退出函数前,删除所有使用的局部变量;2、闭包会在父函数之外,改变父函数的内部变量因此,将父函数作为一个Object对象,将闭包作为其公共方法,将内部变量作为其私有属性;
