Javascript闭包
Closures (闭包)是使用被作用域封闭的变量,函数,闭包等执行的一个函数的作用域。通常我们用和其相应的函数来指代这些作用域。(可以访问独立数据的函数)
闭包是一个函数和函数所声明的词法环境的结合
—-MDN是这么解释Javascript闭包的
一个很教科书的定义。此外也有比较通俗的解释和比喻。
1. 在StackOverflow上有很通俗详细的讨论和解释[How do JavaScript closures work?],就不做搬运工了。
2. 还有一个很有意思的PDF,关于闭包的解释 [secrets_of_javascript_closures]
3. 阮大的文章[学习Javascript闭包(Closure)],主要从变量作用域入手分析解释闭包,可参考文章最后的两个对比案例:
1 2 3 4 5 6 7 8 9 10 |
var name = "The Window"; var object = { name: "My Object", getNameFunc: function () { return function () { return this.name; }; } }; alert(object.getNameFunc()()); |
1 2 3 4 5 6 7 8 9 10 11 |
var name = "The Window"; var object = { name: "My Object", getNameFunc: function () { var that = this; return function () { return that.name; }; } }; alert(object.getNameFunc()()); |
在阅读和理解三篇文章之后,回过头再去理解和温习MDN的解释和例子。
总结:
闭包的来源感觉来自于Javascript的特性:变量赋值,变量可以是方法。这种操作融合了面向对象语言中“委托”和“反射”的概念。
1 2 3 4 5 6 |
var foo = function (params) { return function (options) { //do or return something } } foo(xx)(yy); |
这种写法随之而来的就是变量作用域的问题,比如最常引发的局部变量上升为“全局变量”的效果(如参考内容1中的Example3)。
那么如何准确认梳理某个闭包内部函数、变量作用域?可参考阮大的思路:利用this变量,也可阅读参考内容2中对that和this的对比分析。