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


Warum ist Dies in einer anonymen Funktion undefiniert bei der Verwendung von Javascript im strikten Modus? Ich verstehe, warum das sinnvoll ist, aber ich konnte 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).


75
2018-03-22 12:45


Ursprung


Antworten:


Das liegt daran, dass es bis ECMAscript 262, Ausgabe 5, eine große Verwirrung gab, wenn Leute, die die constructor pattern, habe vergessen, das zu benutzen new Stichwort. Wenn du vergessen hast zu verwenden new beim Aufrufen einer Konstruktorfunktion in ES3 this referenzierte das globale Objekt (window in einem Browser) und Sie würden das globale Objekt mit Variablen überlisten.

Das war ein schreckliches Verhalten und so entschieden sich die Leute bei ECMA, nur um zu setzen this zu undefined.

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 strikt auslösen

"TypeError: this is undefined"

(was ein viel besseres Verhalten ist)


86
2018-03-22 12:50



Es gibt einen Mechanismus, der "Boxen" genannt wird, der die this Objekt vor dem Eintritt in den Kontext der aufgerufenen Funktion. In Ihrem Fall ist der Wert von this sollte sein undefined weil Sie die Funktion nicht als Methode eines Objekts aufrufen. Wenn nicht strikt Modus, in diesem Fall wird dies durch die ersetzt window Objekt. 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


13
2018-03-22 13:00



Gemäß Diese Stapelüberlaufantwortkannst du benutzen this innerhalb anonymer Funktionen, einfach durch Aufruf .call(this) am Ende davon.

(function () {
    "use strict";

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

6
2018-02-13 12:58