2011-10-12 28 views
4

我期待在使用该模式能够引用外部封闭在调用一个函数作为回调时,无论图书馆改变了“this”指针情况下,一些JS视图模型代码(爱是爱的JavaScript):分配给闭包内的变量对闭包的引用 - 泄漏吗?

function FruitViewModel { 
    var that = this; // <-- HERE 

    this.someCallBack = function() { 
     that.utilityFunction(); 
    }; 

    this.utilityFunction = function() { } 
} 

我的问题是:这是否会导致内存泄漏或将其具体实现? (例如,如果垃圾是收集到里面与外面在收集)

编辑:请假定在GC认为这个对象的集合什么都没有持有一个参考someCallBack

回答

1

垃圾收集器足够聪明,可以检测到这种循环引用。所以它不会泄漏。

+0

@Ivan:有[这样的文章](http://www.ibm.com/developerworks/web/library/wa-memleak/)描述了类似的情况,可能会造成混淆。但是它们指的是当你的对象的成员引用时(比如'someCallback')被连接到一个DOM元素,这个DOM元素很长并且不被收集。为DOM元素添加属性与创建全局属性差不多,所以很自然地不允许收集。但正如文章所暗示的那样,它与闭包没有多大关系。 – Groo

1

在所有JS引擎中,直到在父函数中声明的所有函数都不再被引用时才会收集对象。

我不知道这里有任何GC错误。

+0

你的意思是它不会被收集,直到有人持有,比如'someCallBack'的引用?好吧,让我们假设已经是这种情况了 - JS GC是否会处理'that'中的循环引用?它不是经典的A - > B - > A,而是A - > A - > A. –

+0

一旦没有引用'this'或'someCallback'或'utilityFunction','this'和闭包就可以收集。 – SLaks

+0

好的,但仍存在对'this'的引用,存储在'that'中。 –

相关问题