Warum verliere ich den Kontext in Javascript?

8

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:

ändere %Vor%

Es funktioniert offensichtlich.

Aber meine Frage ist:

  • In welchem ​​Stadium habe ich den Kontext verloren?

Ich verstehe nicht: Wenn j() läuft, ist eine Eigenschaft b im Objekt o2 .

Was vermisse ich?

jsbin

    
Royi Namir 05.05.2013, 06:56
quelle

3 Antworten

6

Ich fand, dass Crockford eine ausgezeichnete Beschreibung der Funktionsweise hatte. Funktionen in JavaScript können in vier verschiedenen Stilen aufgerufen werden:

  1. Der Stil "Funktion"
  2. Der Stil "Methode"
  3. Der "Konstruktor" -Stil
  4. Der Stil "Anrufen oder Anwenden".

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.

    
Woody 05.05.2013, 08:02
quelle
1

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".

    
Ihsan 05.05.2013 07:24
quelle
0

Ü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.

    
Gustavo Carvalho 05.05.2013 07:43
quelle

Tags und Links