在闭包中使用 'self' 会导致内存泄漏吗?
Could using 'self' inside a closure lead to a memory leak?
如果我在一个对象中有一个函数(在我的例子中是一个 Backbone 模型)...
doIt: function () {
var self = this,
result = null;
this.doMagic(function(){
result = self.doWizardry();
});
self = null;
return result
}
...我是否需要像我在此处所做的那样将 self 设置为 null,以避免内存泄漏?
额外的问题,闭包对 'result' 的引用也会导致内存泄漏吗?
任何关于提高此类结构效率的建议都将不胜感激!
(希望这不是一个真正的函数,只是说明性的)
谢谢!
没有。事实上,在调用 this.doMamgic()
之前将 self
设置为 null
也会破坏变量 self
,这样 this.doMagic()
将无法使用它,因为它当 this.doMagic()
稍后实际尝试使用它时,该值将被清除。
Javascript 中的自引用本身不会导致内存泄漏。 GC 足够聪明,可以检测到这一点。如果整个对象是其他JS无法访问的,那么对象内部有多少对自身的引用都没有关系。
我在这段代码中没有看到为什么使用变量 self
会导致内存泄漏的特别原因,并且做这样的事情是一个用于存储回调可以使用的状态的公认模式(就像你正在尝试做)。
至于一般建议,doIt()
函数的要点看起来有问题。您似乎正在尝试 return this.doMagic()
设置的 result
值,但是 this.doMagic()
在 doIt()
执行时未被调用,因此 result
在 doIt()
returns.
时永远不会有值
因此,整个结构似乎存在缺陷。要知道要推荐什么,需要了解您要完成的工作以及您如何 calling/using 您尚未公开的代码。
如果我在一个对象中有一个函数(在我的例子中是一个 Backbone 模型)...
doIt: function () {
var self = this,
result = null;
this.doMagic(function(){
result = self.doWizardry();
});
self = null;
return result
}
...我是否需要像我在此处所做的那样将 self 设置为 null,以避免内存泄漏?
额外的问题,闭包对 'result' 的引用也会导致内存泄漏吗?
任何关于提高此类结构效率的建议都将不胜感激!
(希望这不是一个真正的函数,只是说明性的)
谢谢!
没有。事实上,在调用 this.doMamgic()
之前将 self
设置为 null
也会破坏变量 self
,这样 this.doMagic()
将无法使用它,因为它当 this.doMagic()
稍后实际尝试使用它时,该值将被清除。
Javascript 中的自引用本身不会导致内存泄漏。 GC 足够聪明,可以检测到这一点。如果整个对象是其他JS无法访问的,那么对象内部有多少对自身的引用都没有关系。
我在这段代码中没有看到为什么使用变量 self
会导致内存泄漏的特别原因,并且做这样的事情是一个用于存储回调可以使用的状态的公认模式(就像你正在尝试做)。
至于一般建议,doIt()
函数的要点看起来有问题。您似乎正在尝试 return this.doMagic()
设置的 result
值,但是 this.doMagic()
在 doIt()
执行时未被调用,因此 result
在 doIt()
returns.
因此,整个结构似乎存在缺陷。要知道要推荐什么,需要了解您要完成的工作以及您如何 calling/using 您尚未公开的代码。