Wie kann man JavaScript-Variablen beim Einschließen eines äußeren Bereichs de-referenzieren?

8

Ok, hier ist ein Problem Skript.

%Vor%

Dieses Skript generiert drei divs: eins, zwei und drei unter Verwendung eines Arrays.
Ich habe ein (Dom0 für die Einfachheit) Click-Handler auf jeden div gesetzt, der den Index seiner Position im Array alarmiert. - außer es nicht! Es warnt immer 3, den letzten Index des Arrays.
Dies liegt daran, dass das 'i' in 'alert (i)' eine Live-Referenz auf den äußeren Bereich ist (in diesem Fall global) und der Wert 3 am Ende der Schleife ist. Was es braucht, ist eine Möglichkeit, innerhalb der Schleife auf die Referenzierung zu verzichten.

Dies ist eine Lösung und ich neige dazu, sie zu benutzen.

%Vor%

Tut jemand anders etwas anderes?
Gibt es eine wirklich schlaue Art, das zu tun?
Weiß jemand, wie die Bibliotheken das machen?

    
meouw 14.01.2009, 13:43
quelle

4 Antworten

20

Sie müssen diesen kleinen Trick anwenden - erstellen und führen Sie eine Funktion aus, die Ihre Event-Handler-Funktion zurückgibt.

%Vor%     
Greg 14.01.2009, 13:46
quelle
4

Ich würde bei Ihrer eigenen Lösung bleiben, aber ändern Sie sie wie folgt:

%Vor%

Auf diese Weise wird nur ein Funktionsobjekt erstellt - andernfalls wird das Funktionsliteral in jedem Iterationsschritt ausgewertet!

Eine Lösung über den Verschluss ist noch leistungsmäßig schlechter als Ihr ursprünglicher Code.

    
Christoph 14.01.2009 13:57
quelle
1

Ich empfehle Christoph wie mit einer Funktion , da weniger Ressourcen benötigt werden.

Unten ist eine andere Möglichkeit, den Wert für die Funktion zu speichern (das ist möglich, weil eine Funktion ein Objekt ist), und Benutzer argument.callee , um einen Verweis auf die Funktion in der Funktion zu erhalten. In diesem Fall macht es nicht viel Sinn, aber ich zeige die Technik, da sie auf andere Weise nützlich sein kann:

%Vor%

Diese Technik ist nützlich, wenn Ihre Funktion persistente Informationen zwischen Anrufen speichern muss. Ersetzen Sie den obigen Teil mit dem folgenden:

%Vor%

und Sie können später abrufen, wie oft es aufgerufen wurde:

%Vor%

Es kann auch zum Zwischenspeichern von Informationen zwischen Anrufen verwendet werden.

    
some 14.01.2009 14:15
quelle
0

RoBorgs Methode ist definitiv der richtige Weg, aber ich mag eine etwas andere Syntax. Beide erreichen dasselbe, indem sie eine Schließung erzeugen, die "i" bewahrt. Diese Syntax ist für mich nur klarer und erfordert weniger Modifikation Ihres bestehenden Codes:

var links = ['eins', 'zwei', 'drei'];

%Vor%     
Prestaul 15.01.2009 00:29
quelle

Tags und Links