Pourquoi est- ce dans une fonction anonyme indéfinie lors de l'utilisation de javascript en mode strict? Je comprends pourquoi cela pourrait avoir du sens, mais je n'ai pas trouvé de réponse concrète.
Exemple:
(function () { "use strict"; this.foo = "bar"; // *this* is undefined, why? }());
Test dans un violon: http://jsfiddle.net/Pyr5g/1/ Vérifiez l'enregistreur (firebug).
C'est parce que, jusqu'à ECMAscript 262 édition 5, il y avait une grande confusion si les gens qui utilisaient le constructor pattern
, ont oublié d'utiliser le new
mot-clé. Si vous avez oublié d'utiliser de new
lorsque vous appelez une fonction de constructeur dans ES3, this
référence à l'objet global ( window
dans un navigateur) et vous cloquez l'objet global avec des variables.
C'était un comportement terrible et donc les gens de ECMA ont décidé, juste pour que this
pas undefined
.
Exemple:
function myConstructor() { this.a = 'foo'; this.b = 'bar'; } myInstance = new myConstructor(); // all cool, all fine. a and b were created in a new local object myBadInstance = myConstructor(); // oh my gosh, we just created a, and b on the window object
La dernière ligne créerait une erreur dans ES5 stricte
"TypeError: this is undefined"
(Ce qui est un comportement beaucoup mieux)
Il existe un mécanisme appelé "boxing" qui enveloppe ou modifie this
objet avant d'entrer dans le contexte de la fonction appelée. Dans votre cas, la valeur de this
ne doit undefined
être undefined
car vous n'êtes pas appeler la fonction comme méthode d'un objet. En mode non strict, dans ce cas, cela est remplacé par l'objet window
. En mode strict
, il est toujours inchangé, c'est pourquoi il n'est undefined
ici.
Vous pouvez trouver plus d'informations à
https://developer.mozilla.org/fr/JavaScript/Strict_mode
Selon cette réponse de débordement de Stack , vous pouvez l'utiliser dans des fonctions anonymes, simplement en appelant .call(this)
à la fin de celle-ci.
(function () { "use strict"; this.foo = "bar"; }).call(this);