Ich war einige documentation about javascript und stolperte über den folgenden Code Beispiel zu lesen:Warum verschachtelte lokale Funktion bindet `this` zu Fenster anstelle der Eltern
var o = {
value: 1,
outer: function() {
var inner = function() {
console.log(this); //bound to global object
};
inner();
}
};
o.outer();
Es gibt window
.
Ich kann nicht herausfinden, warum das this
Schlüsselwort auf das globale Objekt (window
) anstelle das übergeordnete Objekt (outer
) gebunden ist.
Wenn Sie outer
von inner
zugreifen wollen ‚s Umfang, müssen Sie die outer
passieren‘ s this
(die wie outer
vorbei an sich ist) in seine lokale inner
Funktion als Argument. Also, wie erwartet:
var o = {
value: 1,
outer: function() {
var inner = function (that) {
console.log(that); //bound to global object
};
inner(this);
}
};
o.outer();
Ausgänge outer
.
Ist es nicht ein bisschen ein Unsinn, dass in outer
‚s Umfang this
an das Objekt gebunden ist selbst (dh outer
), während in der inner
‘ s Rahmen, die outer
lokal ist, this
ist neu gebunden an das globale Objekt (dh es überschreibt outer
die Bindung)?
Die ECMAScript specs besagt, dass, wenn der Ausführungskontext für Funktionscode eingeben, wenn die «Anrufer thisArg zur Verfügung gestellt» entweder null oder undefined, dann wird this
auf das globale Objekt gebunden.
Aber die folgenden:
var o = {
outer: function() {
var inner = function() {
console.log('caller is ' + arguments.callee.caller);
};
inner();
}
}
gibt das Objekt outer
selbst:
caller is function() {
var inner = function() {
console.log('caller is ' + arguments.callee.caller);
};
inner();
}
Auf einer Seite, aber wahrscheinlich relevant, Anmerkung:
In strengen Modus die ersten Code-Snippet-Ausgaben undefined
anstelle von Fenster.
Es ist, weil, wie Sie anrufen 'Innen '-' inner(); '. Der Wert von 'this' wird durch die Art festgelegt, wie Sie die Funktion aufrufen. Wie auch immer, "innere" hat keine Beziehung zu "äußeren", es ist nur eine lokale Variable. Wenn Sie 'console.log (this);' innerhalb von 'extern' verwendet haben und es wie folgt aufgerufen haben: 'var a = o.outer; a(); ', Sie bekommen' Fenster'. Sie mögen denken, dass es Unsinn ist, aber es ist so konzipiert - Sie müssen lernen, wie man es richtig verwendet. – Ian
"Die ECMAScript-Spezifikationen geben an, dass beim Eingeben des Ausführungskontexts für den Funktionscode, wenn der von diesem Aufrufer bereitgestellte thisArg entweder null oder nicht definiert ist, dieser an das globale Objekt gebunden ist." - Hast du deine eigene Frage nicht beantwortet? 'inner()' spezifiziert nicht thisArg. –
@Ian so macht der Umfang, in dem der Anruf getätigt wird, überhaupt keine Rolle? –