76 votes

Est-ce que var self = this; un mauvais schéma?

Je me retrouve à avoir besoin de:

var self = this;

beaucoup dans mon javascript "classes". Bien que cela se fait couramment, il se sent un peu mal. Ce que j'espère trouver dans cette question est une meilleure façon de faire face à cela, ou quelque chose à me convaincre, c'est tout à fait correct.

Est-ce la norme de façon à garder le bon liaisons autour? Dois-je standardiser sur l'utilisation de "self" partout, à moins que j'ai explicitement besoin de 'cette'.

edit: je sais exactement pourquoi j'ai besoin de cela, je me demandais simplement si il est considéré comme un peu mal et pourquoi. Je suis au courant il y a aussi la "appliquer" built-in fonction javascript pour définir explicitement la portée lorsque l'appel d'une méthode. Est-il mieux?

17voto

Peter Bailey Points 62125

Oui, c'est la manière standard.

Function.apply() et Function.call() peut aider, mais pas toujours.

Considérez les points suivants

function foo()
{
  var self = this;
  this.name = 'foo';

  setTimeout( function()
  {
    alert( "Hi from " + self.name );
  }, 1000 );       
}

new foo();

Si vous voulais le faire, mais d'éviter l'utilisation d'une variable comme self et l'utilisation call() ou apply() au lieu de cela... eh bien... vous le regardez et commencez à essayer, mais bientôt se rendre compte que vous ne pouvez tout simplement pas. setTimeout() est responsable de l'invocation de la lambda, ce qui rend impossible pour vous de tirer parti de ces autres invocation styles. Si vous souhaitez toujours, en fin de compte certaines intermédiaire variable pour contenir une référence à l'objet.

9voto

bobince Points 270740

Est-ce la norme de façon à garder le bon liaisons autour?

Il n'y a pas de norme, où le JavaScript et classe/instance systèmes sont concernés. Vous aurez à choisir quel type de modèle d'objet que vous préférez. Voici un autre lien vers un document d'information; conclusion: il n'y a pas de résumé.

Généralement garder une copie var self= this;(*) par une fermeture va de pair avec un modèle d'objet construit autour de fermetures avec par exemple des copies de chaque méthode. C'est une bonne façon de faire les choses; un peu moins efficace, mais également en général un peu moins de travail que l'alternative, un modèle d'objet construit autour de prototypage, à l'aide de this, apply() et ECMAScript Cinquième Édition de l' bind() pour obtenir les méthodes liées.

Ce qui pourrait être compté plus que de "mal", c'est quand vous avez un méli-mélo de styles dans le même code. Malheureusement, beaucoup de communes de code JS est-ce (car avouons-le, personne n'a vraiment comprend JavaScript est bizarre natif modèle d'objet).

(*: En général, je utiliser that au lieu de self; vous pouvez utiliser n'importe quel nom de variable que vous voulez, mais self a déjà un peu obscur et complètement inutile sens comme un window membre qui pointe vers la fenêtre elle-même.)

4voto

Patrick Karcher Points 11927

En javascript et d'autres langages avec des fermetures, cela peut être une chose très importante à faire. L'objet qu' this se réfère à une méthode peut réellement changer. Une fois que vous définissez votre self variable est égale à this, puis l'auto sera fiable de rester une référence à l'objet en question, même si this des points plus tard pour quelque chose de différent.

C'est une différence importante en javascript par rapport à de nombreuses autres langues de travail. Je veux en venir .Net, de sorte que ce genre de chose m'a paru étrange au premier abord trop.

Edit: Ah, bon, vous savez tous que. (peut-être encore utile pour quelqu'un d'autre.) Je vais ajouter que de l'Appliquer (et Appel) sont un plus pour l'utilisation de "l'extérieur", en donnant à la fonction que vous appelez un champ d'application spécifique que vous connaissez déjà. Une fois que vous êtes à l'intérieur d'une fonction et que vous êtes sur le point de cascade plus bas dans les fermetures, la technique:

  var self = this;

est le moyen le plus approprié (facile et clair) de manière à ancrer votre actuelle portée.

2voto

g.d.d.c Points 20164

Cela est très probablement fait pour maintenir une référence à this lorsque le périmètre est sur le point de changer (dans le cas d'une fermeture). Je ne sais pas si je considérerais cela comme une mauvaise pratique ou un mauvais modèle en soi, non. Vous voyez beaucoup de choses similaires avec des bibliothèques comme jQuery et beaucoup avec AJAX.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X