mit anonymen Funktionen in javascript for-Schleifen
Habe ich gesehen, anonyme Funktionen innerhalb von for-Schleifen induzieren neuer Bereich auf der Website in einer oder zwei stellen und würde gerne wissen, ob es Sinn macht.
Beispiel:
var attr, colors = ['green','blue','red'];
for ( attr = 0; attr < colors.length; attr++) {
(function() {
var colorAttr = colors[attr];
//do something with colorAttr
})();
}
Verstehe ich, es hat etwas zu tun mit dem halten des Geltungsbereichs innerhalb der for-Schleife sauber, aber in welchen Situationen würde dies notwendig sein? Wäre es gute Praxis, dies zu tun, überall müssen Sie deklarieren Sie eine neue var innerhalb der for-Schleife?
- Hier ist ein Beispiel, bei dem Verschluss in Schleifen sinnvoll: stackoverflow.com/questions/1552941/...
attr
änderungen im Verlauf der Schleife, so dass, wenn Sie verwendencolors[attr]
in einer callback-Funktion, die es nicht beziehen sich auf diecolors[attr]
Sie eigentlich wollen.- Ich verwende asynchrone Aufrufe nur, wenn etwas zu warten, um abzuschließen. In diesem Fall kann es problematisch sein, zu verfolgen, die
colors[]
änderungen. - so ein Muster wie diese machen mehr Sinn, wenn Sie anbringen, einen event-handler drin?
- Dies ist nicht eine callback - es ist eine sofort ausgeführte Funktion.
colorAttr
den Gültigkeitsbereich, die sofort ausgeführte Funktion, aber es kann gehen bis zu den übergeordneten Bereich haben und gerne den Zugangattr
. - so wäre es schlecht oder falsch üben, diese zu verwenden, wenn es nicht ein callback/event-handler beteiligt?
- wahrscheinlich. Es sei denn, Sie sind sehr paranoid über Umfang und wirklich, wirklich nicht wollen, dass
colorAttr
decalred im gleichen Bereich wieattr
undcolor
. Aber in der Praxis, dass man wirklich nicht darauf ankommt, in gut entwickelte code. Wenn Sie nicht erstellen eine Funktion in einer Schleife, die Sie in der Regel nicht brauchen, um wickeln Sie es in eine Funktion wie diese.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie innere Funktionen, die nicht sofort ausgeführt, als Teil der Schleife.
Obwohl
var color
ist innerhalb der Schleife, Schleifen haben keinen Spielraum. Man eigentlich nur noch eine variable, die jeder loop-iteration verwendet. Also, wenn die timeouts Feuer, Sie verwenden alle den gleichen Wert, der zuletzt eingestellte Wert durch die Schleife.Diese eine erfasst den Wert bei jedem Durchlauf in einen Streit um eine Funktion, die nicht einen Bereich erstellen. Jetzt jede Funktion bekommt eine eigene version eines
color
variable, die wird sich nicht ändern, wenn-Funktionen erstellt innerhalb dieser Schleife werden später hingerichtet.Du bist fast da. Es macht nur Sinn in deinem snippet, wenn Sie pass in die
attr
Wert in Ihren selbst aufrufen der Funktion als argument. So speichern kann, dass die variable innerhalb seines eigenen scope-ObjektNun, die Aktivierung Objekt bzw. lexikalische Umgebung aufnehmen (die ES3 und ES5 scope-Objekte), müssen Sie einen Eintrag für jeden Wert hinter
attr
und daher seine closured.colors[attr]
imcolorAttr
ob oder ob nicht dieattr
Wert übergeben wird, als parameter. Sicherlich die übergabe von Parametern ist ein sauberer Ansatz.