重複の可能性:
ループ内の Javascript クロージャー - 簡単な実用例
for (i = 0; i < 100; i++) {
setTimeout(function() {
console.log(i);
}, 500)
}
上記のコードでは、100 しか出力されません。その理由はわかっています。しかし、現在の i 値をコールバックに送信するにはどうすればよいsetTimeout
ですか?
重複の可能性:
ループ内の Javascript クロージャー - 簡単な実用例
for (i = 0; i < 100; i++) {
setTimeout(function() {
console.log(i);
}, 500)
}
上記のコードでは、100 しか出力されません。その理由はわかっています。しかし、現在の i 値をコールバックに送信するにはどうすればよいsetTimeout
ですか?
ループ内で無名関数を使用して、クロージャを作成します。
for (i = 0; i < 100; i++) {
(function(i){
window.setTimeout(function() {
console.log(i);
}, 500)
})(i);
}
呼び出し時に値を関数に渡すと、値がコピーされ、関数の各インスタンスには、ループカウンターが変更されても変更されない独自のコピーがあります。
setTimeout は、 callback に渡されるパラメーターを受け入れます。
for (i=0;i<100;i++){
setTimeout(function(i){
console.log(i);
},500, i)
}
これは機能します:
for (var i = 0; i < 100; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 500);
})(i);
}
for (i = 0; i < 100; i++) {
setTimeout((function(i) {
return function(){
console.log(i);
}
})(i), 500)
}