88 votes

Pourquoi "this" dans une fonction anonyme n'est pas défini lorsque l'on utilise strict ?

Pourquoi est-ce que ce dans une fonction anonyme indéfinie lors de l'utilisation de javascript en mode strict ? Je comprends pourquoi cela pourrait avoir un 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 le logger (firebug).

112voto

jAndy Points 93076

En effet, jusqu'à l'édition 5 de l'ECMAscript 262, une grande confusion régnait entre les personnes qui utilisaient l'option constructor pattern a oublié d'utiliser le new mot-clé. Si vous avez oublié d'utiliser new lors de l'appel d'une fonction constructrice dans ES3, this a fait référence à l'objet global ( window dans un navigateur) et vous encombreriez l'objet global de variables.

C'était un comportement terrible et donc les gens de l'ECMA ont décidé, juste pour fixer this a 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 entraînerait une erreur en ES5 strict.

"TypeError: this is undefined"

(ce qui est un bien meilleur comportement)

15voto

Samuel Rossille Points 4590

Il existe un mécanisme appelé "boxing" qui permet d'envelopper ou de modifier l'adresse de l'utilisateur. this avant d'entrer dans le contexte de la fonction appelée. Dans votre cas, la valeur de this devrait être undefined parce que vous n'appelez pas la fonction comme une méthode d'un objet. En mode non strict, dans ce cas, elle est remplacée par l'élément window objet. Sur le site strict mode, il est toujours inchangé, c'est pourquoi il est undefined ici.

Vous trouverez de plus amples informations à l'adresse suivante
https://developer.mozilla.org/en/JavaScript/Strict_mode

9voto

ReverseTales Points 99

Selon Cette réponse de Stack Overflow vous pouvez utiliser this à l'intérieur de fonctions anonymes, simplement en appelant .call(this) à la fin de celui-ci.

(function () {
    "use strict";

    this.foo = "bar";
}).call(this);

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