2016-05-16 4 views
0

Ich verstehe, dass, wenn ich eine Funktion in einer lexikalischen Umgebung definiere, sie die lexikalische Schließung entscheidet, auf die die Funktion Zugriff hat, und auch die Variablen von äußeren Bereichen und in der Prototypkette.Ist lexikalischer Abschluss ein Attribut des Ausführungskontexts einer Funktion?

Meine Frage ist, was passiert, wenn wir den Ausführungskontext einer Funktion explizit mit bind oder call oder apply ändern. Wie wirkt sich das auf die Variablen aus, die in der Funktion aufgrund lexikalischen Abschlusses hätten verfügbar sein müssen, sowie auf Variablen, die in der Prototypkette gefunden werden sollten?

Mein Instinkt sagt, die vorherige Schließung wird ersetzt und eine neue Prototyp-Kette sollte verfügbar sein und Variable möglicherweise in der neuen Prototyp-Kette basierend auf Szenario gefunden werden, aber dann stellt sich die Frage, ob ich eine neue Ausführung erstellen Kontext, dadurch gibt es einen neuen lexikalischen Abschluss, kann ich dann irgendwie andere Variablen in diesen neu geschaffenen lexikalischen Abschluss einfügen?

Gibt es auch eine Möglichkeit, die this einer Funktion zu ändern, bevor sie aufgerufen wird, aber ihre vorherige lexikalische Schließung beibehalten?

+3

'bind',' call' und 'apply' ändern nur den 'this'-Wert des Kontext einer Funktion. Sie ändern nicht die Schließung env. Also jedes "Eltern" env. Variablen sind immer noch verfügbar, auch wenn die genannten Methoden verwendet werden. –

+0

@SebastienDaniel Bitte fügen Sie es als Antwort hinzu, merke ich der mein Fehler jetzt – sasidhar

+0

die Antwort wurde geschrieben, danke. –

Antwort

1

bind, call und apply nur den this Wert einer Funktion ändern (d.h. sein Kontext) und nicht ihren Umfang (d.h. Umgebung).

Also alle Eltern env. Variablen sind immer noch verfügbar, auch wenn die genannten Methoden verwendet werden. Nur this wird geändert.

Verwandte Themen