Wie man veränderbare Variable von der Schließung vermeidet
Ich habe einige code wie dieser:
for(var id=0; id < message.receiver.length; id++){
var tmp_id = id;
zlib.gzip(JSON.stringify(message.json), function(err, buffer){
...
pushStatusPool[message.receiver[tmp_id]] = null; //fix memory leak
delete pushStatusPool[message.receiver[tmp_id]];
...
});
}
Und ich bekam eine Warnung, dass die Verwendung tmp_id
im Verschluss kann zu Problemen führen, denn es ist eine veränderbare variable.
Wie könnte ich das vermeiden? Ich meine, wie könnte ich das senden einer unveränderlichen variable um Rückruf, da diese eine for-Schleife und ich kann nicht den code ändern von zlib.gzip
? Oder in anderen Worten, wie konnte ich passiere ein argument für eine Schließung?
Kommentar zu dem Problem - Öffnen
Wie können Sie vermeiden, was? Ihre Frage ist nicht klar. Bitte viel mehr spezifisch, was Sie wollen, helfen Sie mit.
Ich begann zu schreiben, eine Antwort ist... aber es wird wirklich klar, dass dies könnte ein umgestalten 🙁 Du bist Gzip die gleiche Sache, die
- Meldung.- Empfänger.Länge
- mal. Post die ganze Sache? InformationsquelleAutor der Frage bxshi | 2012-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie einen Bereich erstellen, richtig zu erfassen
tmp_id
mit einem self-executing-Funktion. Das ist, weil die gesamte for-Schleife ist ein Bereich, was bedeutet, das jeder Zeit durch, Sie erfassen die gleiche variable. So wird der callback am Ende mit den falschen ids, weiltemp_id
's Wert geändert werden, bevor die callback aufgerufen wird.Würd ich ignorieren (oder Abschaltung) der Warnung, obwohl, das scheint zu sein, beschwerte sich, weil
temp_id
ist veränderbar, Sie könnte zuweisen. Das ist sowas von albern. Wenn Sie wirklich wollen, um es zu beheben, versuchen Sie es mit derconst
- Schlüsselwort anstelle vonvar
.InformationsquelleAutor der Antwort
Ich habe vor dem gleichen problem und löste es leicht zu modifizieren: die Antwort von user24359, durch die übergabe der id, um die Schließung:
InformationsquelleAutor der Antwort gennadi.w
hier eine Vereinfachung der user24359 die tolle Antwort.
Das ist die Lösung:
Den oben genannten code, meldet sich ein b und ist die Lösung.
Die folgenden code-Protokolle b b :
InformationsquelleAutor der Antwort Michael Moeller
Ich habe vor dem gleichen problem Winkelmesser. Gelöst mit folgenden code -
InformationsquelleAutor der Antwort Piyush Jajoo
@user24359 Antwort ist eine gute Lösung, aber Sie können ersetzen Sie einfach die
var
Schlagwort von derlet
Stichwort.wird
Details siehe hier.
Bearbeiten : Als Heriberto Juarez vorgeschlagen, es funktioniert nur für Browser, die unterstützt EcmaScript6.
InformationsquelleAutor der Antwort Bludwarf
Erstellen Verschlüsse in einer Schleife mit
var
(tmp_id
) wird im oberen Bereich der callback-Funktion ist eine allgemeiner Fehler, die vermieden werden sollten aufgrund dervar
nicht-block-Bereich. Deshalb, und weil jede Schließung, erzeugt in der Schleife, teilt die gleichen lexikalische Umgebung, die variable wird immer der letzten iterierten Wert (d.h.message.receiver.length - 1
alstmp_id
) wenn die callback-Funktion wird aufgerufen. Die IDE erkennt dieses Verhalten und beschwert sich zu Recht.Zur Vermeidung der Warnung, es gibt mehrere Lösungen:
Ersetzen
var
mitlassen
dafür sorgen, dass jede erstellte Schließung, seinen eigenen Gültigkeitsbereichtmp_id
definiert, in jeder iteration:Erstellen Sie eine lexikalische Umgebung in jeder iteration durch die Nutzung IIEF wie gennadi.w hat.
Erstellen Sie eine callback-Funktion in jeder iteration durch die Verwendung einer factory-Funktion (
createCallback
):bind
die variable(N) auf die callback-Funktion, in der Sie erhalten vorangestellt Ihrer Parameter:Wenn möglich
var
sollten vermieden werden, da der ECMAScript 2015 wegen solcher fehleranfälligen Verhalten.InformationsquelleAutor der Antwort Boghyon Hoffmann