当我们有这样的代码时:

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,因为没有办法取回对该变量的引用。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!