在功能中引用父范围,泄漏概率?

时间:2014-08-11 09:25:48

标签: javascript node.js memory-leaks

在setInterval中引用父变量时,这可能会引发泄漏,因为我引用了self?

var A = {};

A.act = function(a_var) {
   var self = this;

   self.a_var = a_var;
   setInterval(function() {
      console.log(self.a_var);
   }, 100)
}

A.act();

1 个答案:

答案 0 :(得分:1)

嗯,在你开始间隔计时器运行的意义上存在泄漏,你不能在不离开页面的情况下停下来(因为你没有保留句柄)。这意味着创建计时器,计时器回调和act的{​​{1}}调用的上下文永远不会是GC,因为浏览器在其计时器中有对回调的引用list,并且回调将关闭创建它的调用的上下文。但是,我假设这是理想的行为,所以不是真的泄密。

theory 中,A参数由闭包引用(间接地,通过引用对a_var的调用的执行上下文的绑定对象),等等即使你没有使用它,也要记忆在你的记忆中(你改用act)。

在实践中(也就是说,允许实施优化),它很复杂。现代引擎可以优化变量,并且他们知道关闭不能访问,但是令人惊讶的简单事情可能会干扰该过程(至少在V8上)。 This other question and answer have more on that.