【发布时间】: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