【发布时间】:2016-09-19 10:38:23
【问题描述】:
当涉及到函数闭包时,我很难理解垃圾收集是如何发生的。例如下面的 JS 代码使用闭包实现了一个加法器函数:
function adder() {
var sum = 0
return function(x) {
sum += x
return sum
}
}
function abc() {
var pos = adder()
for (i = 0; i < 10; i++) {
console.log(pos(i))
}
}
abc()
输出:
0
1
3
6
10
15
21
28
36
45
每次调用pos 函数时,参数x 会添加到sum 并返回累积和。我不明白的是,为什么sum 的值保留在函数adder 中?不应该在内部函数返回时(即pos 返回时)立即将 sum 的值收集起来。
相反,每次使用新值x 调用pos 时,上一次调用的总和都会以某种方式保留在内存中。导致这种情况发生的幕后情况是什么?
【问题讨论】:
-
函数引用
sum,并且仍然存在对函数本身的实时引用,这意味着闭包不会被垃圾收集。这就是闭包的全部意义所在。 -
adder被调用一次,其中var sum = 0将被定义一次;然后sum是从adder返回的匿名函数的本地;var sum = 0未设置第二次 -
@Pointy:但是当引用
sum的内部函数返回时,sum不会被垃圾回收吗? -
不,因为变量
pos仍然是对该返回的内部函数的活动引用。
标签: javascript node.js garbage-collection closures