2010-02-27 16 views
6

Eine lokale Funktion im Closure deklariert eine Variable mit demselben Namen, die im Closure existiert. Wie können wir also auf die Variable closure von der lokalen Funktion aus zugreifen?Unterscheidung von Schluss- und lokalen Variablen

function closure() 
{ 
    var xVar; 
    function func1() 
    { 
     var xVar; 
     // how to distinguish local and closure scopes. 
     return xVar; 
    } 
    return function() { return func1(); }; 
} 

Das Erstellen eines privaten Objekts und die Erstellung privater Variablen als Eigenschaften dieses Objekts können hilfreich sein. Aber ich frage mich, ob es eine bessere und saubere Lösung gibt. Kann eine Scope-Kette helfen?

Ich habe bearbeitet, um es zu einem vollständigen Abschluss zu machen. Wie auch immer, Schließungen sind hier nicht so wichtig, es könnte für innere Funktionen in Betracht gezogen werden, aber es könnte eine Lösung mit Schließungen geben.

Dank

Antwort

3

Sie können nicht explizit auf die Scope-Kette in JS zugreifen. Ihr Problem ist das uralte von variablem Shadowing, aber es ist noch viel ärgerlicher, weil in JS die Scope-Kette tatsächlich dort zur Laufzeit ist, es ist nur nicht für Sie zugänglich.

können Sie ein paar Tricks spielen mit aktuellem Bereich rejiggering, wenn Sie den verhassten with Operator verwenden, aber das (wie auch arguments ‚s Anrufer/Angerufenen Sachen) wirklich nur geben Sie mit ihren Eigenschaften auf Objekte und Funktionen zuzugreifen. Es gibt keine Möglichkeit zu sagen: "Gib mir, was xVar im n-1 Laufzeitbereich bedeutet, von hier".

0

In Ihrem Beispiel ist die XVAR Variable kein Verschluss, weil Sie jede Funktion in ihrem Umfang neu definiert. Wenn Sie diese Variable als Closure verwenden möchten, deklarieren Sie sie weiterhin mit dem Befehl var in der Funktion closure() und deklarieren Sie sie dann nicht mit der Funktion var in der Funktion func1(). Verwenden Sie stattdessen die Variable sofort in func1().

Es gibt keine einfache Möglichkeit zu testen, ob eine Funktion eine Schließung oder eine lokale Variable ist. Sie müssten eine Art Flusskontrolltest durchführen und dann Zuweisungen analysieren, wo Zuweisungen stattfinden und wo Zuweisungen nicht stattfinden. Dann müssen Sie diese Ergebnisse vergleichen. Sie könnten ein Werkzeug in JavaScript schreiben, um diese Analyse für eine gegebene Eingabe durchzuführen und Ihnen einen Bericht als Ausgabe zu schreiben.

+3

Ich denke, dass er das weiß. Die Frage ist, wie würden Sie aus Code innerhalb von "func1" explizit auf die in "closure" definierte "xVar" verweisen (und nicht auf die in "func1" definierte "xVar")? – Pointy

+0

Ich antwortete das in meinem ersten Absatz. –

1

In einem inneren Bereich definierte Variablen verbergen Variablendeklarationen in einem äußeren Bereich. Die "bessere und saubere Lösung" besteht nicht darin, Variablennamen auf diese Weise wiederzuverwenden.

Verwandte Themen