2010-01-30 6 views
0

J'ai un assez grand nombre de fonctions javascript que je travaille à refactoriser en un ensemble de classes utilisant Prototype.simplifier la liaison des fonctions javascript anonymes à la classe

Je me demandais s'il y avait un moyen de rendre les fonctions anonymes de liaison à la classe plus simple? Je n'oublie pas d'ajouter le lien à la fin. Ou est-ce juste comme cela est fait tout le temps?

var arr = this.getSomeArray(); 
arr.each(function(t) { 
    t.update(val); 
    this.updateJSValue(t); 
}.bind(this)); 

Répondre

1

Vos options sont essentiellement d'appeler une fonction (bind, addMethods ou une autre fonction que vous écrivez) ou utiliser une variable locale plutôt que this:

var self=this; 
arr.each(function(t) { 
    t.update(val); 
    self.updateJSValue(t); 
}); 

Si vous avez un grand nombre de fonctions , la variable locale nécessite le moins de frappe Pour seulement quelques fonctions, il n'y a pas trop de différence.

function ThingMixin(self) { 
    self.foo = function(arr) { 
     arr.each(function(t) { 
      t.update(val); 
      self.updateJSValue(t); 
     }); 
    }; 
    ... 
}; 
... 
ThingMixin(Ralph.prototype); 

// or an anonymous function: 
(function (self){ 
    self.foo = function(arr) { 
     arr.each(function(t) { 
      t.update(val); 
      self.updateJSValue(t); 
     }); 
    }; 
    ... 
})(Ralph.prototype); 
+0

Y a-t-il un type d'augmentation/diminution des performances avec l'utilisation de la variable locale? La plupart des endroits où ils se produisent sont en double pour les boucles. – Casey

+0

Je m'attendrais à ce que l'utilisation de la mémoire augmente légèrement, car les variables vivront plus longtemps en raison des fermetures, mais l'impact sur les performances devrait être négligeable. Notez que 'bind' utilise très probablement une variable locale. – outis

+0

Ce commentaire a plus à voir avec l'exactitude que la performance, mais si vous voulez vous lier au même objet pour chaque itération, mettez 'self' en dehors de la boucle et l'impact sur les performances serait imperceptible; si vous voulez vous lier à un objet différent, déclarez 'self' dans le bloc de boucle. – outis

Questions connexes