JavaScript lokales Scoping: var vs. this

9

Ich kann mich nicht auf einen bestimmten Fall konzentrieren, in dem ich nach JavaScript-Variablen suche. Anders als bei anderen Beispielen und Fragen, die ich gefunden habe, interessiert mich das Scoping für verschachtelte Funktionen.

Ich habe ein Beispiel im JSFiddle eingerichtet. Der relevante Teil ist folgender:

%Vor%

Nun verstehe ich, dass ein Verweis auf a direkt funktioniert. Ich verstehe auch, dass die Nachrichten 3 und 4 ( this.a und this.b ) fehlschlagen, weil this sich auf die interne Funktion bezieht. Ich verstehe auch, dass Zeile 6 funktioniert, weil ich den Verweis auf das ursprüngliche Objekt speichern.

Was ich nicht verstehe, ist:

  • Warum funktionieren die Nachrichten 1 und 2 nicht?
  • Warum funktionieren die Nachrichten 5 und 6 nicht?
Alpha 23.02.2013, 23:23
quelle

3 Antworten

4

Die Variable a ist genau das, eine Variable. Es ist sichtbar im Bereich von innerMethod (was nur eine geschachtelte Funktion ist), wie a , wie es deklariert wurde (dh JavaScript hat lexikalische Scoping-Regeln, innere Funktionen können Variablen der Funktionen sehen, die sie definiert haben innerhalb von).

this ist nicht identisch mit dem lokalen Bereich des MyObject -Konstruktors.

Sie haben gesehen, dass self ein Alias ​​für this von MyObject ist und dass innerMethod this in seinem eigenen Geltungsbereich überschrieben hat. Da this jedoch kein Alias ​​für den Funktionsumfang ist, funktionieren weder self.a noch this.a hier.

Für eine genauere Erläuterung des lexikalischen Scopings können Sie z.B. Start bei Wikipedia: Ссылка

Sie können über die Ausführungskontexte und die Bezeichnerauflösungsregeln im ECMA-Standard Ссылка

lesen     
thebjorn 23.02.2013, 23:31
quelle
1

Es ist ein Problem mit dem Umfang, wenn Funktionen erstellt werden, speichern sie ihre Umgebung (einschließlich Variablen).

Wenn also innerMethod erstellt wird, kann es die Variablen self und a sehen.

Ein wichtiges Konzept ist, dass der Gültigkeitsbereich bei der Deklaration der Funktion erstellt wird und nicht beim Aufruf.

In Ihrem Fall 1 wird b nicht deklariert (das Objekt ist nicht dasselbe).

In den Fällen 5 und 6 haben Sie self.a nicht erstellt.

    
Kaeros 23.02.2013 23:29
quelle
0

Der Hauptgrund ist, dass self nicht gleich this im Umfang von innerMethod ist. this ist ein Schlüsselwort, das den Besitzer der Funktion referenziert. Für innerMethod ist es KEINE Instanzmethode, es gehört zum Fenster.

%Vor%

Sie können hier hier

spielen     
code4j 05.02.2015 11:51
quelle

Tags und Links