Warum ist dies in einer anonymen Funktion undefiniert, wenn Javascript im strengen Modus verwendet wird? Ich verstehe, warum dies sinnvoll sein könnte, 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).
Antworten:
Dies liegt daran, dass es bis ECMAscript 262 Edition 5 eine große Verwirrung gab, wenn Leute, die das
constructor pattern
verwendeten, dasnew
Schlüsselwort vergessen haben . Wenn Sienew
beim Aufrufen einer Konstruktorfunktion in ES3 vergessen haben, diese zu verwenden ,this
auf das globale Objekt (window
in einem Browser) verwiesen haben und das globale Objekt mit Variablen überhäufen würden.Das war schrecklich Verhalten und damit die Menschen in ECMA beschlossen, nur um Satz
this
zuundefined
.Beispiel:
Die letzte Zeile würde einen Fehler in ES5 strict auslösen
(was ein viel besseres Verhalten ist)
quelle
this === window
verwirrend ist und den globalen Geltungsbereich als Token für FunktionenEs gibt einen Mechanismus namens "Boxing", der das
this
Objekt umschließt oder ändert, bevor er in den Kontext der aufgerufenen Funktion wechselt. In Ihrem Fall sollte der Wert vonthis
sein,undefined
weil Sie die Funktion nicht als Methode eines Objekts aufrufen. Im nicht strengen Modus wird dies in diesem Fall durch daswindow
Objekt ersetzt. Imstrict
Modus ist es immer unverändert, deshalb ist esundefined
hier.Weitere Informationen finden Sie unter
https://developer.mozilla.org/en/JavaScript/Strict_mode
quelle
Gemäß dieser Antwort auf diesen Stapelüberlauf können Sie
this
anonyme Funktionen verwenden, indem Sie einfach.call(this)
am Ende aufrufen .quelle
this
diesWindow
in diesem Fall das Objekt sein wird, was möglicherweise nicht erwünscht ist