阮一峰的网络日志-学习Javascript闭包(Closure)
David Flanagan-JavaScript权威指南(第6版)
Douglas Crockford-JavaScript语言精粹
说明:文章主要部分转载自阮一峰的博客内容,权威指南和语言精粹,少量为个人理解
一,变量的作用域
1,JS的函数内部可以直接读取全局变量;
2,函数内部声明变量的时候,如果不使用var命令,实际上是声明了一个全局变量;
3,在函数外部无法读取函数内的局部变量
二 如何从外部读取局部变量?
有时候,需要得到函数的内部变量,
可以在函数f1的内部,定义一个嵌套函数f2,此时f2中可以访问f1中的变量
(JS语言特有的链式作用域chain scope, 子对象会一级一级向上寻找所有父对象的变量,父对象的所有变量对于子对象都是可见的,反之不成立),
将f2作为返回值,可以在f1外部读取f2的内部变量
三 闭包的概念
第二节中的f2函数,就是闭包
各种专业文献中的closure定义非常抽象,我的理解是(引用一中的作者)-闭包就是能够读取其他函数内部变量的函数
由于在JS中,只有函数内部的子函数可以读取局部变量,可以把闭包简单的理解成--定义在函数内部的函数
本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁
四 闭包的用途
闭包可以用在很多的地方,最大的用处是(1)可以在函数外部读取到函数内部的变量,(2)可以让变量的值始终保持在内存中
下面的代码中,result实际上就是闭包f2函数,一共执行了两次,这