Ich habe diesen einfachen Code:
%Vor%Aber diesen Code ausführen:
o2.f2(o.f1)
ergibt undefined . (dabei erwarte ich "22")
Jetzt weiß ich, dass der Kontext irgendwo verschwunden ist. und daher Wenn ich den Code in o2
zu:
Es funktioniert offensichtlich.
Aber meine Frage ist:
Ich verstehe nicht: Wenn j()
läuft, ist eine Eigenschaft b
im Objekt o2
.
Was vermisse ich?
Ich fand, dass Crockford eine ausgezeichnete Beschreibung der Funktionsweise hatte. Funktionen in JavaScript können in vier verschiedenen Stilen aufgerufen werden:
Ich könnte die genauen Namen falsch verstehen, aber der Geist ist derselbe. Sie sollten auf jeden Fall das Buch "JavaScript: The Good Parts" bekommen, wenn Sie es nicht haben.
Also trotzdem - weiter zu Ihrer Frage. Das Entscheidende ist, dass der Wert für "this" davon abhängt, welchen Stil Sie verwenden.
%Vor%In Ihrem Beispiel verlieren Sie "das" wegen der Art, wie Sie die Funktion aufrufen.
Wenn Sie es wie folgt machen,
Funktion wird im o2 Kontext aufgerufen
%Vor%auch diese werden auch funktionieren:
%Vor%Andernfalls nennst du es wie eine gewöhnliche Funktion außerhalb des Kontexts.
j Wird aus seinem Kontext gerissen und du hast keine kniffligen Schlüsse daraus gemacht (was nicht deine Absicht ist). Um "dieses" darin zu arbeiten, brauchst du einen Bereich. Dieser Bereich in Ihrer Frage für j ist Fenster, das kein "b" enthält, daher erhalten Sie ein "undefined".
Überprüfen Sie diese Tests:
%Vor% Mir ist klar, dass der Kontext genau dann verloren geht, wenn man eine Funktion als Parameter übergibt, und zwar in der (*)
, auf die im obigen Code hingewiesen wird.
Was passiert ist j = arguments[0] = o.f1
und an diesem Punkt verlieren Sie den Kontext.
Wenn Sie eine Funktion als Parameter übergeben, übergeben Sie nur die Referenz im Speicher an diese Funktion. Ohne den Kontext zu binden, wird der einfache Aufruf j()
fehlschlagen. Deshalb müssen Sie apply
oder den this
Trick verwenden, der von Ihsan gezeigt wurde.
Tags und Links javascript