var i;
var print = function(){
console.log(i);
};
for(i = 0 ; i<10;i++){
setTimeout(print,1000);
};
Es druckt 10 zehnmal ich kann nicht verstehen warum?Es druckt 10 zehn Mal ich kann nicht verstehen warum?
var i;
var print = function(){
console.log(i);
};
for(i = 0 ; i<10;i++){
setTimeout(print,1000);
};
Es druckt 10 zehnmal ich kann nicht verstehen warum?Es druckt 10 zehn Mal ich kann nicht verstehen warum?
Die setTimeout
ist ein asynchroner Aufruf. Das heißt, es wird erst ausgeführt, nachdem die gesamte Schleife ausgeführt wurde. In Ihrem JS Interpreter, würde es so aussehen:
1: for loop. // i = 0
2: send setTimeout #1. increment i. // i = 1
3: send setTimeout #2. increment i. // i = 2
4: send setTimeout #3. increment i. // i = 3
5: send setTimeout #4. increment i. // i = 4
6: send setTimeout #5. increment i. // i = 5
7: send setTimeout #6. increment i. // i = 6
8: send setTimeout #7. increment i. // i = 7
9: send setTimeout #8. increment i. // i = 8
10: send setTimeout #9. increment i. // i = 9
11: send setTimeout #10. increment i. // i = 10
12: finish for loop. // i = 10
13: exec setTimeout #1. // i = 10
14: exec setTimeout #2. // i = 10
15: exec setTimeout #3. // i = 10
16: exec setTimeout #4. // i = 10
17: exec setTimeout #5. // i = 10
18: exec setTimeout #6. // i = 10
19: exec setTimeout #7. // i = 10
20: exec setTimeout #8. // i = 10
21: exec setTimeout #9. // i = 10
22: exec setTimeout #10. // i = 10
Wenn die Ausführungsphase geschieht, würde i
bereits 10.
Der richtige Weg diese Verschlüsse verwendet zu tun haben. Sie behalten den Umgebungswert bei, indem sie den Wert der Variablen packen.
var i;
var print = function(i) {
console.log(i);
};
for (i = 0; i < 10; i++) {
(function (a) {
setTimeout(function() {
print(a);
}, 1000);
})(i);
}
Dies ist wegen der Ereignisschleife JavaScript. Alle Ihre setTimeouts sind am Ende der Warteschlange der Ereignisschleife gestapelt. Sobald Ihre for-Schleife abgeschlossen ist (zu dem Zeitpunkt, wenn ich bereits auf 10 erhöht habe), werden alle setTimeouts ausgeführt. Daher sehen Sie 10 ständig gedruckt.
n
Wert wird aus dem Verschluss entnommen. Es enthält den Wert = 1,2,3 ... während der Erstellung der Funktion.
var i ;
var print = function(n){
console.log(n);
};
for(i = 0 ; i<10;i++){
setTimeout((function(n){
return function() {
print(n);
}
})(i),1000);
};
es tut genau das, was sie zu tun annimmt, um zu verwenden, während() {} Schleife oder do {} while() Schleife für ein besseres Verständnis. –
was versuchst du genau zu machen? am Ende der Schleife einmal anrufen? –
@Praveen Kumar setTimeout wird am Ende des Callstacks aufgerufen, sobald der Callstack ausgeführt wurde und setTimeout ausgeführt wird. Einige Devs setzen die Zeit auf 0mm setTimeout (print, 0); nur für eine Funktion, die sofort am Ende ausgeführt wird. –