在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();
答案 0 :(得分:1)
嗯,在你开始间隔计时器运行的意义上存在泄漏,你不能在不离开页面的情况下停下来(因为你没有保留句柄)。这意味着创建计时器,计时器回调和act
的{{1}}调用的上下文永远不会是GC,因为浏览器在其计时器中有对回调的引用list,并且回调将关闭创建它的调用的上下文。但是,我假设这是理想的行为,所以不是真的泄密。
在 theory 中,A
参数由闭包引用(间接地,通过引用对a_var
的调用的执行上下文的绑定对象),等等即使你没有使用它,也要记忆在你的记忆中(你改用act
)。
在实践中(也就是说,允许实施优化),它很复杂。现代引擎可以优化变量,并且他们知道关闭不能访问,但是令人惊讶的简单事情可能会干扰该过程(至少在V8上)。 This other question and answer have more on that.