深入理解闭包(http://www.jb51.net/article/24101.htm)
一,变量的作用域
要理解闭包,首先要理解javascript特殊的变量作用域
就是两种:全局变量和局部变量!!!!!
js的语言的特殊之处就是可以在函数内部可以直接读取全局变量,例:
var n = 999;
function f1(){
alert(n);
}
f1(); //999
但是另一方面,函数外部自然没有办法读取函数内部的变量(不公平)

但是!!!函数内部定义变量的时候一定要用var命令,不用的话,则是定义了一个全局变量,函数外部是可以访问的。

二,如何从外部读取局部变量
正常情况下,这是办不到的,只有通过变通方法才能实现。
!!那就是在函数内部,再定义一个函数

如上,f2()就是函数f1()d的内部函数,f2()能够访问f1()内部的所有局部变量,但是f1()却不能访问f2()中的变量。这是js中特有的链式作用域结构。
子对象会一级一级的向上寻找所有父元素的变量。所以,父元素的所有变量对子元素都是可见的。反之不成立哦
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取他的局部变量了吗?

三,闭包的概念
上述的f2就是闭包
闭包就是能够读取其他函数内部变量的函数;
在js中,只有函数内部的子函数才能读取函数局部变量,所有闭包又可以理解为:定义在函数内部的函数;
但是本质上,闭包就是将函数内部和外部连接起来的一座桥梁。!!!!!
四,闭包的用途
最大的两个好处
1,前面提到的可以读取函数内部的变量
2,另一个就是让这些变量的值始终保存在内存中;

个人解读:
如图,定义了个f1函数,函数内部又定义了变量n,全局函数nAdd(因为没有用var,所以是全局变量),函数声明f2(),并且返回f2。那么var result = f1();中的result实际上是返回的f2.所以第一次调用时是999.但是接着调用了nAdd(),使999+1=1000了,所以第二次调用result时候,n是1000.
这个足以证明闭包让这些值始终保存在内存中!!!
五,使用闭包的注意点
1,由于闭包会始终都把变量保存在内存中,内存消耗大,所以不能滥用闭包。否则会造成性能问题,在IE中会导致内存泄漏。(解决方法是在退出函数之前,将不使用的局部变量全部删除)
2,闭包会在父函数的外部,改变父函数内部变量的值。如果将父函数当作对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。


也就是说,调用函数后,没有定义var的a会覆盖var a =4;
浙公网安备 33010602011771号