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:
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 Ссылка
lesenEs 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.
Tags und Links javascript scope scoping