2011-10-12 5 views
4

Je cherche un peu de code JS ViewModel qui utilise ce modèle pour être en mesure de faire référence à la fermeture extérieure dans le cas où la bibliothèque qui change le pointeur « ce » lors de l'appel d'une fonction comme un rappel (Gotta love JavaScript):Affecter à une variable à l'intérieur d'une fermeture une référence à la fermeture: fuit-elle?

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

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

    this.utilityFunction = function() { } 
} 

Ma question est la suivante: est-ce que cela causera une fuite de mémoire ou sera-t-elle spécifique à l'implémentation? (par exemple, si la poubelle est collectée à l'envers ou à l'extérieur)

Éditer: Veuillez supposer qu'au moment où le GC considère cet objet pour la collecte, rien ne contient de référence à someCallBack.

Répondre

1

Le garbage collector est assez intelligent pour détecter de telles références de cycle. Donc, ça ne fuira pas.

+0

@Ivan: Il existe [des articles comme celui-ci] (http://www.ibm.com/developerworks/web/library/wa-memleak/) qui décrivent des situations similaires et peuvent prêter à confusion. Mais ils se réfèrent à des situations où une référence au membre de votre objet ('someCallback', par exemple) est attachée à un élément DOM, qui a une longue durée de vie et n'est pas collecté. L'ajout de propriétés aux éléments DOM est plus ou moins la même chose que la création de globals, il est donc naturel que cela ne permette pas la collecte. Mais cela n'a pas grand chose à voir avec les fermetures, comme l'implique l'article. – Groo

1

Dans tous les moteurs JS, l'objet ne sera pas collecté tant que toutes les fonctions déclarées dans la fonction parente ne seront plus référencées.

Je ne suis pas au courant de bogues GC pertinents ici.

+0

Vous voulez dire qu'il ne sera pas collecté jusqu'à ce que quelqu'un détienne, disons, une référence à 'someCallBack'? Ok, supposons que c'est déjà le cas - le JS GC fera-t-il face à la référence cyclique dans 'that'? Ce n'est pas le classique A -> B -> A, mais A -> A -> A. –

+0

Une fois qu'il n'y a aucune référence à 'this' ou' someCallback' ou 'utilityFunction',' this' et la fermeture sera collectable. – SLaks

+0

Ok, mais il y a toujours une référence à 'this' stockée dans' that'. –

Questions connexes