前端-诗人
好看的皮囊千篇一律,有趣的灵魂万里挑一,感谢这么有趣的你到来

深入理解闭包(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,闭包会在父函数的外部,改变父函数内部变量的值。如果将父函数当作对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。

 

也就是说,调用函数后,没有定义vara会覆盖var a =4

 

posted on 2017-11-22 16:36  plane-  阅读(158)  评论(0)    收藏  举报