【发布时间】:2016-05-22 17:52:09
【问题描述】:
我正在做一门课程,它正在经历范围/闭包并简要提到垃圾收集。在课程中提出一个问题:
示波器能停留多长时间?答案是——直到 不再有任何引用它。是的,所以我们基本上说的是 过去,闭包有点像对隐藏作用域对象的引用。 所以只要有一些函数仍然有一个闭包 范围,该范围将保持不变。但一旦关闭 消失,范围可以收集垃圾。 "
var sum = function sumHndlr(x, y) {
if (y !== undefined) {
return x + y;
} else {
return function(y) {
return x + y;
}
}
}
所以对我来说,对闭包的引用是当我们将函数分配给sum 变量时,但这并不意味着它会永远持续下去,或者我不理解 js 在编译器方面的执行方式解析器等?
【问题讨论】:
-
“永远”是什么意思?是的,关闭将持续到
sum,但这不是永远... -
好吧,也许我需要更清楚地了解垃圾收集的实际情况。因为目前我正在考虑垃圾收集,例如当您删除事件侦听器时。也许你可以解释为什么它不是永远的。谢谢!
-
sum/sumHndlr没有关闭。你必须调用它(没有y)才能得到一个。然后,只要你把它放在某个地方,它就会一直存在(连同它关闭的x)。如果您希望我们提供更多信息,请向我们展示该电话。 -
对——我认为这是对的。内部函数是记住它的词法范围的函数。我想我不明白那怎么会消失?对我来说,我认为如果您将
sum分配给null或其他东西,就会发生这种情况。但现在我猜了。 -
@AntonioOrtiz:从函数到作用域的引用永远不会消失。只有当所有指向它的函数都被回收时,该范围才能被垃圾回收。如果您执行了
var add2 = sum(2);,那么分配add2 = null将使函数符合垃圾回收条件。
标签: javascript garbage-collection closures