相关疑难解决方法(0)

JavaScript闭包如何工作?

您如何向知道其所包含概念的人(例如函数,变量等)解释JavaScript闭包,但不了解闭包本身?

我已经看过维基百科上给出的Scheme示例,但遗憾的是它并没有帮助.

javascript variables closures scope function

7644
推荐指数
82
解决办法
139万
查看次数

JavaScript封闭是如何被垃圾收集的

我已经记录了以下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)

和相应的截图:

Chromebug的屏幕截图

似乎闭包(在这种情况下,function() {})如果对象被同一上下文中的任何其他闭包引用,则所有对象都保持"活动",无论该闭包本身是否可以访问.

我的问题是关于其他浏览器(IE 9+和Firefox)的关闭垃圾收集.我对webkit的工具非常熟悉,比如JavaScript堆分析器,但我对其他浏览器的工具知之甚少,所以我无法对此进行测试.

在这三种情况中哪些将IE9 +和Firefox垃圾收集 someClass 实例?

javascript firefox internet-explorer garbage-collection google-chrome

166
推荐指数
3
解决办法
2万
查看次数

闭包中的变量存储在哪里 - 堆栈还是堆?

如下代码:

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不会被破坏并保留在内存中(这就是闭包工作的原因).所以我的问题是变量是存储,堆栈还是堆?

javascript heap stack closures

13
推荐指数
1
解决办法
2639
查看次数

JavaScript闭包如何在低级别工作?

我知道闭包被定义为:

[A]堆栈帧,当函数返回时不会释放.(好像'stack-frame'是malloc'ed而不是堆栈!)

但我不明白这个答案如何适应JavaScript的存储机制.口译员如何跟踪这些价值观?浏览器的存储机制是否以类似于堆和堆栈的方式进行分段?

关于这个问题的答案:JavaScript闭包如何工作?说明:

[A]函数引用也有一个关闭的秘密引用

这个神秘的"秘密参考"背后的潜在机制是什么?

编辑许多人说这是依赖于实现的,所以为了简单起见,请在特定实现的上下文中提供解释.

javascript browser closures

12
推荐指数
2
解决办法
1070
查看次数

堆或堆栈上的Javascript闭包?

JavaScript(根据标准)存储闭包在哪里:堆还是堆栈?
关闭是否有第三个明确的位置?

javascript heap stack closures

9
推荐指数
1
解决办法
1527
查看次数