2010-07-28 6 views
2

J'ai une question simple à propos de jQuery mais plutôt des approches javascript en général ...jquery: contexte avec des fermetures?

Est-ce que ça fonctionne? :

this._checkedTexts.length = 0; // <- array belonging to "me" 
var contextCheckedTexts = this._checkedTexts; 

$('#valueContainer input:checked').each(function() { 
    contextCheckedTexts.push($(this).text()); 
}); 

Puisque 'ceci' pointe vers l'élément, j'utilise une fermeture ici pour garder un contexte supplémentaire pour le 'chaque' gestionnaire.

Est-ce la manière «comment c'est fait» ou pourrait-il y avoir n'importe quel risque impliqué en utilisant une fermeture de cette façon (memoryleak-sage ....)?

Quelles sont les autres options disponibles? Je trouve cela très pratique - mais je suis toujours un peu inquiet à propos de l'introduction de problèmes de comptage de références lors de l'utilisation de fermetures - qui seront difficiles à trouver plus tard.

Répondre

0

Je ne sais pas ce que vous essayez d'atteindre vos codes, mais peuvent également être fait comme ça,

this._checkedTexts.length = 0; // <- array belonging to "me" 

var arr = $('#valueContainer input:checked').map(function() { 
    return $(this).text(); 
}).get(); 

this._checkedTexts = this._checkedTexts.concat(arr); 
+0

Assez impressionnant :) J'aime jQuery de plus en plus ... merci pour l'indice !! - mais encore, la question demeure: est-ce ok (et l'approche habituelle) d'utiliser des fermetures pour le contexte à une fonction qui a le «mauvais» ce-pointeur? – Wolfgang

+0

oui c'est bien d'utiliser des fermetures ... mais si vous le faites, faites comme ça, 'var self = this;' ... pour que vous puissiez appeler d'autres propriétés en utilisant 'self'. par exemple. 'self._checkedTexts.push ($ (this) .text()) ;. avec cela, vous éliminez déjà 'var contextCheckedTexts = this._checkedTexts; ... – Reigel

+0

... ressemble à un plan - et aussi si je le fais de cette façon à chaque fois, il y a probablement moins de confusion :) merci! – Wolfgang

0

Il semble bien que les méthodes jQuery comme each, map, grep ne supporte pas le contexte par défaut (il est lié à l'objet jQuery actuel). Cependant, vous pouvez créer votre propre fonction bind qui appliquera le contexte aux fonctions (mais dans ce cas vous ne devez pas utiliser le contexte par défaut pour obtenir le texte des éléments).