Warum ist "dies" in einer anonymen Funktion nicht definiert, wenn mit strengen?
Warum ist diese in einer anonymen Funktion nicht definiert, wenn mit javascript im strict-Modus? Ich verstehe, warum dies sinnvoll ist, aber ich konnte keine konkrete Antwort.
Beispiel:
(function () {
"use strict";
this.foo = "bar"; //*this* is undefined, why?
}());
Test in einem fiddle: http://jsfiddle.net/Pyr5g/1/
Überprüfen Sie heraus die logger (firebug).
Beachten Sie, dass dies hat nichts zu tun mit anonymen Funktionen, aber der Aufruf-Methode. Siehe diese geänderte fiddle (schau in der Konsole).
Dies kann sein, wo einige der Verwirrung kam. Vielen Dank für den Hinweis.
Dies kann sein, wo einige der Verwirrung kam. Vielen Dank für den Hinweis.
InformationsquelleAutor TJ. | 2012-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist, weil, bis ECMAscript-262 edition 5, gab es eine große Verwirrung, wenn Menschen, die wo mit der
constructor pattern
vergessen haben, verwenden Sie dienew
Schlüsselwort. Wenn Sie vergessen haben, dennew
beim Aufruf einer Konstruktor-Funktion in ES3this
verwiesen, das Globale Objekt (window
im browser), und Sie würden die Klamotten die Globale Objekt-Variablen.Das war schrecklich Verhalten und damit die Leute bei ECMA beschlossen, nur um
this
zuundefined
.Beispiel:
Die Letzte Zeile würde einen Fehler auslösen, in ES5 strict
(die ein viel besseres Verhalten)
Würde ich haben auf der Suche nach mir selbst, Aber ich hörte, Douglas Crockford mehrere Male, wobei er sagte, dies war der Grund für diese Entscheidung.
Es ist erwähnt in JavaScript: Die Guten Teile von Crockford. Es wird im detail beschrieben. Nicht über ECMAs Entscheidung, obwohl.
Dies ist der logische Grund dafür, warum der strikte Modus Standardeinstellungen mit dieser zu unbestimmt. Der andere Grund ist die Effizienz, die andere logische Grund ist, dass
this === window
ist verwirrend und Lecks globalen Bereich als einen token FunktionenDanke für die Antwort. Das macht Sinn. Ich fand auch eine kompakte Erklärung über die änderungen dies auf javascriptweblog.wordpress.com/2011/05/03/...: "vor allem, wenn das erste argument zu nennen oder anzuwenden, ist null oder nicht definiert ist, das dieser Wert für die aufgerufene Funktion wird nicht umgewandelt werden, auf das Globale Objekt."
InformationsquelleAutor jAndy
Gibt es einen Mechanismus, genannt "Boxen", die wraps oder ändern Sie die
this
Objekt vor Eintritt in den Kontext der aufgerufenen Funktion.In deinem Fall der Wert der
this
sollteundefined
weil Sie nicht den Aufruf der Funktion als Methode eines Objekts.Wenn nicht-strict-Modus", in diesem Fall, diese wird ersetzt durch die
window
Objekt.In
strict
- Modus-es ist immer unverändert, deswegen ist esundefined
hier.Weitere Informationen finden Sie unter
https://developer.mozilla.org/en/JavaScript/Strict_mode
wie können wir also eine variable zuordnen zu Fenster-Objekt im strict-Modus??
InformationsquelleAutor Samuel Rossille
Laut Dieser Stack Overflow-Antwort, die Sie verwenden können
this
im inneren anonyme Funktionen, einfach durch aufrufen.call(this)
am Ende.this
werden dieWindow
Objekt, in diesem Fall, was möglicherweise nicht gewünschtInformationsquelleAutor ReverseTales