感谢 与
什么是闭包?
闭包,Closure.先不要从名称来猜想其作用,因为不管是中文还是英文,都很难理解这个词。
JS有一种特殊的变量作用域:- 函数内部可以直接读取全局变量
- 函数外部无法读取函数局部变量
那么,如何从外部读取函数内部变量?如下:
function f1(){ var n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999
f2就是closure,闭包
以下是阮老师的原话:由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成" 定义在一个函数内部的函数"。 所以,在本质上, 闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包可以干嘛?
闭包最大的作用,有两个:读取函数内部的变量,并且将这些变量保存在内存中。
请看:function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000
为什么会弹出1000?n没有别重新声明为999吗?
因为nAdd是全局变量,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。闭包通过这种方式起作用了。to be countinued...