【问题标题】:Javascript and memory, how is it handled? [duplicate]Javascript和内存,是怎么处理的? [复制]
【发布时间】:2017-10-22 11:31:42
【问题描述】:

我认为一旦它们的上下文不再存在,变量就会被销毁:

function foo () {
    let bar = "something"
    return bar
}

就像在这个例子中一样,我认为bar 在函数执行后就被销毁了。

但是现在,我发现你可以用 Javascript 写这个:

function foo () {
  let bar = "something"
  return {
    print () {
        console.log(bar)
    }
  }
}

let f = foo()

f.print();

此代码打印“某物”。所以我现在想知道javascript如何处理它的内存。为什么bar 在函数结束时不会被销毁?

现在,如果我这样写:

function foo () {
  let bar = "something"
  let hugeVar = _.range(1,1000*1000*1000*1000) // A huge array
  return {
    print () {
        console.log(bar)
    }
  }
}

hugeVar 还在记忆中吗? Javascript 如何决定保留哪些内容和不保留哪些内容?

【问题讨论】:

  • Javascript 中永远不会破坏变量:你不能随意破坏变量。当浏览器认为您不再需要该变量时,该变量将被增加或销毁。参考这个链接:stackoverflow.com/questions/16963066/how-to-delete-a-variable
  • @GuyT:变量不会被垃圾收集,只有对象。此外,该标准甚至不保证 。该标准仅指定对象何时可达或不可达。如何处理无法访问的对象留给实现。绝大多数人将不会在对象变得无法访问时立即收集它,而是等到有大量无法访问的对象时,然后在一个批次中收集它们。
  • JavaScript 如何处理内存与闭包无关。选择了错误的重复项。
  • 问题的最后一部分是what i asked some time ago的简化版。您可以在那里找到答案。
  • @JörgWMittag 一个变量存储在内存中的某处——作为范围(词法环境)的一部分——它会像其他所有东西一样被垃圾收集。它不是一个 JS 对象,而是一个原生对象。

标签: javascript


【解决方案1】:

这叫做闭包。函数将记住那些对外部范围内变量的引用。阅读它以获取更多信息。

【讨论】:

    【解决方案2】:

    您提供的代码是closures 的示例。

    闭包是一个堆栈帧,它在函数开始执行时分配,并且在函数返回后不被释放(就像堆栈帧在堆而不是堆栈!)

    闭包会记住父级范围

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-10
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2012-10-14
      相关资源
      最近更新 更多