JavaScript - 函数调用后的垃圾回收

3
我阅读了一些有关 JavaScript 垃圾回收的内容,根据它们的说法,在函数返回后会对函数的局部变量进行回收(除了需要打破循环引用的情况,以便垃圾回收工作)。
我想了解的是,在这种情况下,“函数返回”是什么意思?
这是否意味着:
1. 函数必须返回值。 或者简单地说: 2. 函数调用已结束。
常识(至少在我看来)表明是 2),但如果我错了:
- 对于不返回任何值的函数,该怎么办? - 我需要为不返回任何内容的函数添加一个空的 return; 以使垃圾回收器发挥作用吗?

2
语言规范没有指定垃圾回收发生的时间。只要不回收程序仍然可以访问的任何内容,实现可以在任何时候自由地进行回收。您链接的文章讨论了一些可能的方法,但并没有要求使用其中任何一种方法。该文章相当古老,自原始编写以来,GC技术已经发生了很大变化。 - Raymond Chen
关于你的链接:现在是2013年。我想可以安全地假设没有人再使用Netscape Navigator 3了 :-) - David Knipe
1个回答

9
不含return语句的函数会隐式地返回undefined。所以,函数“结束”和“返回”的意思是一样的。
关于垃圾回收,请记住局部变量在函数返回后不会立即被回收;这些变量只能在此时成为垃圾回收的可回收对象。垃圾回收器会在浏览器认为必须运行或者认为可以在不影响可见性能的情况下运行时运行(这取决于实现)。

非常好的答案,点赞并选择了。 - heytools
谢谢,我很感激你的反馈。 - bfavaretto
我曾经认为还有引用计数 - 因此在简单情况下,它将立即收集未引用的内容。例如 x = [1,2,3]; x = null; 数组内存可以立即被重新使用。垃圾回收器只需要在循环连接结构欺骗引用计数时运行,并进行收集。 - OsamaBinLogin
@OsamaBinLogin,虽然实现可能会有所不同,但最肯定也有引用计数。这个答案是以闭包为思考对象编写的,局部变量被返回的函数对象封闭。外部函数返回后,我认为处理由GC负责。 - bfavaretto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接