javascript - 内存堆栈如何在 javascript 中工作

标签 javascript memory stack

当我们有这样的代码时:

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

关于javascript - 内存堆栈如何在 javascript 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2677656/

相关文章:

Javascript 插件无法与 Turbolink 一起正常工作

javascript - 防止 Bootstrap 从 "jumping"折叠元素

Python计算大文件中的单词数

当内存在 ubuntu 中仍然可用时发生 Java 内存不足

c++ - 递归函数中的段错误。使用 std::stack (C++)

C++ 存储最后 X 个传入项目的最佳数据结构?

javascript - webpack/lib/Compiler.js 中的意外标记应用 : util. deprecate((...args) => {

android - imageSwitcher 和内存错误

java - 没有额外空间的 O(n) 中的反转堆栈不会发生

javascript - 如何重置 YouTube 嵌入 <iframe> 中的事件触摸事件监听器?