webentwicklung-frage-antwort-db.com.de

Warum ist "this" in einer anonymen Funktion undefiniert, wenn strict verwendet wird?

Warum ist dieses in einer anonymen Funktion undefiniert, wenn JavaScript im strikten Modus verwendet wird? Ich verstehe, warum dies sinnvoll sein könnte, konnte aber keine konkrete Antwort finden.

Beispiel:

(function () {
    "use strict";

    this.foo = "bar"; // *this* is undefined, why?
}());

Test in einer Geige: http://jsfiddle.net/Pyr5g/1/ Überprüfen Sie den Logger (Firebug).

80
TJ.

Dies liegt daran, dass bis zur Ausgabe 5 von ECMAscript 262 große Verwirrung darüber herrschte, ob Personen, die das constructor pattern, habe vergessen, das Schlüsselwort new zu verwenden. Wenn Sie vergessen haben, new beim Aufrufen einer Konstruktorfunktion in ES3 zu verwenden, hat this auf das globale Objekt verwiesen (window in einem Browser), und Sie haben das globale Objekt mit Variablen überfrachtet.

Das war ein schreckliches Verhalten und so beschlossen die Leute von ECMA, this auf undefined zu setzen.

Beispiel:

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

Die letzte Zeile würde einen Fehler in ES5 strict auslösen

"TypeError: this is undefined"

(das ist ein viel besseres Verhalten)

94
jAndy

Es gibt einen Mechanismus namens "boxing", der das Objekt this umschließt oder ändert, bevor der Kontext der aufgerufenen Funktion aufgerufen wird. In Ihrem Fall sollte der Wert von thisundefined sein, da Sie die Funktion nicht als Methode eines Objekts aufrufen. Im nicht strikten Modus wird dies in diesem Fall durch das Objekt window ersetzt. Im strict Modus ist es immer unverändert, deshalb ist es undefined hier.

Weitere Informationen finden Sie unter
https://developer.mozilla.org/en/JavaScript/Strict_mode

15
Samuel Rossille

Entsprechend This Stack Overflow answer können Sie this in anonymen Funktionen verwenden, indem Sie .call(this) am Ende aufrufen.

(function () {
    "use strict";

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