当我们有这样的代码时:
function a(){
var x =0;
this.add=function(){
alert(x++);
}
}
var test = new a();
test.add(); // alert 0
test.add(); // alert 1
test.add(); // alert 2
这是如何运作的? 一旦 test = new a() 完成, a() 中 'x' 的值是否应该“消失”?包含 x 的堆栈也应该消失了,对吧?或者,javascript 是否始终保留曾经创建的所有堆栈,以防将来引用它们?但这不太好,会不会……?
请您参考如下方法:
您要查找的词是“关闭”。
在另一个函数中创建一个 函数
会为内部函数提供一个(隐藏的)引用,指向运行外部函数的本地作用域。
只要您保留一份测试
,它就明确引用了add
函数,并且那个函数有一个对调用 a
构造函数时创建的作用域的隐式引用。 那个 作用域明确引用了x
,以及函数中定义的任何其他局部变量。 (这包括 this
值和构造函数的 arguments
— 尽管您不能从 add
内部访问它们,因为该函数自己的 this
/arguments
正在隐藏它们。)
当你放开 test
时,JavaScript 解释器可以放开 x
,因为没有办法取回对该变量的引用。