您如何向知道其所包含概念的人(例如函数,变量等)解释JavaScript闭包,但不了解闭包本身?
我已经看过维基百科上给出的Scheme示例,但遗憾的是它并没有帮助.
我已经记录了以下Chrome错误,这导致我的代码中存在许多严重且非显而易见的内存泄漏:
(这些结果使用Chrome Dev Tools的内存分析器,它运行GC,然后获取未收集的所有内容的堆快照.)
在下面的代码中,someClass实例是垃圾回收(好):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
Run Code Online (Sandbox Code Playgroud)
但在这种情况下它不会被垃圾收集(坏):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
Run Code Online (Sandbox Code Playgroud)
和相应的截图:

似乎闭包(在这种情况下,function() {})如果对象被同一上下文中的任何其他闭包引用,则所有对象都保持"活动",无论该闭包本身是否可以访问.
我的问题是关于其他浏览器(IE 9+和Firefox)的关闭垃圾收集.我对webkit的工具非常熟悉,比如JavaScript堆分析器,但我对其他浏览器的工具知之甚少,所以我无法对此进行测试.
在这三种情况中哪些将IE9 +和Firefox垃圾收集 someClass 实例?
javascript firefox internet-explorer garbage-collection google-chrome
如下代码:
var foo = function() {
var a = 1; // closure var
return function() { // closure fun
console.log(a);
}
};
var bar = foo();
Run Code Online (Sandbox Code Playgroud)
当foo退出(或者说,返回)时,我们知道变量a不会被破坏并保留在内存中(这就是闭包工作的原因).所以我的问题是变量是存储,堆栈还是堆?
我知道闭包被定义为:
[A]堆栈帧,当函数返回时不会释放.(好像'stack-frame'是malloc'ed而不是堆栈!)
但我不明白这个答案如何适应JavaScript的存储机制.口译员如何跟踪这些价值观?浏览器的存储机制是否以类似于堆和堆栈的方式进行分段?
关于这个问题的答案:JavaScript闭包如何工作?说明:
[A]函数引用也有一个关闭的秘密引用
这个神秘的"秘密参考"背后的潜在机制是什么?
编辑许多人说这是依赖于实现的,所以为了简单起见,请在特定实现的上下文中提供解释.
JavaScript(根据标准)存储闭包在哪里:堆还是堆栈?
关闭是否有第三个明确的位置?