Dans un fichier JavaScript, j'ai vu:
function Somefunction(){
var that = this;
...
}
Quel est le but de la déclarer that
et de lui attribuer this
cela?
javascript
this
Chris
la source
la source
Réponses:
Je vais commencer cette réponse par une illustration:
Ma réponse l'a démontré à l'origine avec jQuery, qui n'est que très légèrement différent:
Parce que
this
change fréquemment lorsque vous modifiez la portée en appelant une nouvelle fonction, vous ne pouvez pas accéder à la valeur d'origine en l'utilisant.that
Si vous le remplacez par, vous pouvez toujours accéder à la valeur d'origine dethis
.Personnellement, je n'aime pas l'utilisation de
that
l'alias. Il est rarement évident de savoir à quoi il se réfère, surtout si les fonctions sont plus longues que quelques lignes. J'utilise toujours un alias plus descriptif. Dans mes exemples ci-dessus, j'utiliserais probablementclickedEl
.la source
var self = this;
. Le motthat
semble impliquer que la variable est n'importe quoi MAISthis
.forEach
fonction prend un deuxième argument optionnel qui est la liaison de la fonction.colours.forEach(function(){/* 'this' is bound correctly --> */}, this);
Il faut donc ajouter une note quivar that = this
n'est pas réellement nécessaire avecforEach
.Depuis Crockford
JS Fiddle
Cette alerte ...
la source
that
variable n'est pas du tout utilisée dans son exemple. Cela donne l'impression que la simple création d'une variable holdingthis
fait quelque chose pour le reste du code.Il s'agit d'un hack pour faire fonctionner les fonctions internes (fonctions définies à l'intérieur d'autres fonctions) comme elles le devraient. En javascript, lorsque vous définissez une fonction à l'intérieur d'une autre, elle est
this
automatiquement définie sur la portée globale. Cela peut être déroutant car vous vous attendezthis
à avoir la même valeur que dans la fonction externe.C'est spécifiquement un problème lorsque vous créez une fonction comme méthode d'un objet (comme
car.start
dans l'exemple) puis créez une fonction à l'intérieur de cette méthode (commeactivateStarter
). Dans la méthode de niveau supérieurthis
pointe vers l'objet, c'est une méthode de (dans ce cas,car
) mais dans la fonction internethis
pointe maintenant vers la portée globale. C'est une douleur.La création d'une variable à utiliser par convention dans les deux étendues est une solution à ce problème très général avec javascript (bien qu'il soit également utile dans les fonctions jquery). C'est pourquoi le nom à consonance très générale
that
est utilisé. C'est une convention facilement reconnaissable pour surmonter une lacune dans la langue.Comme El Ronnoco fait allusion à Douglas Crockford pense que c'est une bonne idée.
la source
L'utilisation de
that
n'est pas vraiment nécessaire si vous effectuez une solution de contournement en utilisantcall()
ouapply()
:la source
Parfois,
this
peut faire référence à une autre portée et faire référence à autre chose, par exemple, supposons que vous vouliez appeler une méthode constructeur à l'intérieur d'un événement DOM, dans ce casthis
fera référence à l'élément DOM et non à l'objet créé.HTML
JS
Démo
La solution ci - dessus assing
this
pourthat
ensuite nous pouvons et l' accès la propriété de nom dans lasayHi
méthode à partirthat
, donc cela peut être appelé sans problèmes à l' intérieur de l'appel DOM.Une autre solution consiste à lui affecter un
that
objet vide et à lui ajouter des propriétés et des méthodes, puis à le renvoyer. Mais avec cette solution, vous avez perduprototype
le constructeur.la source
Voici un exemple `
Ainsi, vous pouvez voir que la valeur de this correspond à deux valeurs différentes selon l'élément DOM que vous ciblez, mais lorsque vous ajoutez "that" au code ci-dessus, vous modifiez la valeur de "this" que vous ciblez.
..... $ (that) .css ("background-color", "# ffe700"); // Ici, la valeur de "that" est ".our-work-group> p> a" car la valeur de var that = this; donc même si nous sommes à "this" = '.our-work-single-page', nous pouvons toujours utiliser "that" pour manipuler l'élément DOM précédent.
la source