for循環,定時器,閉包。
阿新 • • 發佈:2017-09-27
logs tool 大於 con i++ ddc 時間設置 timeout 一個
1,對於一個基本的for循環,順序輸出變量值。
for(var i = 0; i < 4; i++){ console.log(i);//結果不多說了吧 }
2,如果for循環中有定時器,如下代碼。
for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000*i); }
setTimeout 會延遲執行,那麽執行到 console.log 的時候,其實 i 已經變成 5 了,開始輸出一個 5(1000*0),然後每隔一秒再輸出一個 5,一共 5 個 5。”
3,如果要得到每一秒輸出i的正確結果,就要引入閉包來保存變量i不被銷毀。
for (var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, i * 1000);
})(i);
}
4,如果要實現,每隔3s輸出一個數字,即,3s輸出1,3s後再輸出2...,就要對定時器時間設置
for (var i = 0; i < 4; i++) { (function(a) { setTimeout(function() { console.log(a); }, a*3000); //..... })(i) }
實際上,for循環很快,上述代碼類似於同時啟動3個定時器,只需要確保時間不一樣即可。在此,時間分別是3s,6s,9s,由於同時啟動,但是執行時間不同,各個時間間隔都是3s。巧妙地達到了目的。
案例4的實際用處如下:
for (var i = 0; i < 1000; i++) {
(function(a) {
setTimeout(function() {
console.log(a);
$(‘#div1‘).removeClass().addClass(‘r‘+a);
$(‘#div1‘).html(a);
}, a*60);
})(i)
}
但是在數字大於5位數的時候,明顯會有卡頓甚至引起瀏覽器奔潰。
for循環,定時器,閉包。