Pourquoi est-ce "ceci" dans une fonction anonyme indéfinie lors de l'utilisation stricte?

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);