Frage
Bei der Implementierung einer asynchronen Schleife können Probleme auftreten.
Versuchen wir, eine asynchrone Methode zu schreiben, die den Indexwert der Schleife einmal in einer Schleife ausgibt.
<script> for(var i = 0; i < 5; i++){ setTimeout(function(){ document.writeln(i);document.writeln("<br />"); },1000); } </script>
Die Ausgabe des obigen Programms ist:
5
5
5
5
5
Grund
Jedes Timeout (Timeout) verweist auf das ursprüngliche i, nicht auf seine Kopie. Also erhöht die for-Schleife i auf 5, dann läuft die Zeitüberschreitung und ruft den aktuellen Wert von i auf (der 5 ist).
Lösung
Es gibt verschiedene Möglichkeiten, i zu kopieren. Die gebräuchlichste und am häufigsten verwendete Methode besteht darin, einen Abschluss zu erstellen, indem eine Funktion deklariert und i an diese Funktion übergeben wird. Wir verwenden hier eine selbstaufrufende Funktion.
Führen Sie den Code aus
<script> for(var i = 0; i < 5; i++){ (function(num){ setTimeout(function(){ document.writeln(num);document.writeln("<br />"); },1000); })(i); } </script>
Ausgabe
0
1
2
3
4