经过大量阅读和 hack,我觉得我终于开始了解 JavaScript 闭包及其用途了。然而,我读过的一些资源的措辞对我来说似乎有点矛盾。或者,也许我只是读得太多了。
helephant.com(链接)的一篇优秀文章指出:
当嵌套在另一个函数中的函数从其父范围访问变量时,就会创建闭包。
和...
闭包实际上是在外部函数退出时创建的,而不是在创建内部函数时创建的。
在给出的示例的上下文中,我理解这两点。
但是,来自 John Resig 网站(链接)的更基本的教程指出,下面的代码块中有一个闭包。
var num = 10;
function addNum(myNum){
return num + myNum;
}
addNum(5);
我见过的几乎所有有用的闭包示例都会返回对内部函数的引用,并稍后对其进行处理。所以这个例子似乎有点毫无意义,但无论如何,让我们尝试接受并理解它仍然是一个闭包。但是,当我尝试整合 helephant 的概念(在外部函数退出之前不会创建闭包)并对其进行一些修改时,我想出了这个:
function outerFunction() {
var num = 10;
function addNum(myNum){
return num + myNum;
}
alert(addNum(0));
num = 5;
}
outerFunction();
现在,根据 Resig 的说法,addNum
创建了一个闭包。根据 helephant 的说法,在outerFunction
返回之前不会创建闭包。但是......闭包(如果它真的是一个闭包)在退出时使用num
from before的值。outerFunction
矛盾?
不可否认,因为我在退出之前调用 了......它使用当前值似乎是合乎逻辑的。但这让我质疑 Resig 的说法,即他提出的简单示例确实是一个闭包。但是……我有什么资格质疑雷西格?我肯定误会了什么?addNum
outerFunction
num
为了使这更适合问答形式,以下是我总结的问题:
(1) Resig 的例子(以及我的扩展)是一个闭包吗?
(2) 如果是,为什么它使用外部作用域返回之前封闭的 var 的值?