以下是幾種for循環(huán)輸出代碼
1. 代碼一
for (var i = 0; i < 5; i++) {
console.log(i);
}
這幾行代碼的結(jié)果是直接輸出0~4
2.代碼2
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000 * i);
}
因為SetTimeOut會延遲執(zhí)行,所以執(zhí)行到consolo.log()的時候i已經(jīng)變成了5,所以結(jié)果是開始輸出一個5,然后隔一秒輸出一個5,一共5個5
3.代碼3
for (var i = 0; i < 5; i++) {
(function(i){
setTimeout(function() {
console.log(i);
}, 1000 * i);
})(i)
}
因為閉包每次執(zhí)行,并每次都帶有參數(shù)i,所以輸出的結(jié)果是先輸出一個0,然后分別隔一秒輸出2,3,4
4.代碼4
for (var i = 0; i < 5; i++) {
(function(){
setTimeout(function() {
console.log(i);
}, 1000 * i);
})(i)
}
因為閉包內(nèi)部沒有保存對參數(shù)i的引用,所以結(jié)果是開始輸出一個5,然后隔一秒輸出一個5,一共5個5
5.代碼5
for (var i = 0; i < 5; i++) {
setTimeout((function() {
console.log(i);
})(i), 1000 * i);
}
這里給SetTimeout傳遞了一個立即執(zhí)行函數(shù),SetTimeout可以接受函數(shù)或者字符串作為參數(shù),但是參數(shù)為立即執(zhí)行函數(shù),相當于underfind
SetTimeout(相當于underfind,1000*i);
所以輸出的結(jié)果為:立馬輸出0~4
6.代碼6
setTimeout(function() {
console.log(1)
}, 0);
new Promise(function executor(resolve) {
console.log(2);
for (var i = 0; i < 10000; i++) {
i == 9999 && resolve();
}
console.log(3);
}).then(function() {
console.log(4);
});
console.log(5);
首先setTimeout,會先設(shè)置一個定時,在定時結(jié)束后將傳遞這個函數(shù)放到任務(wù)隊列里面,因此開始肯定不會輸出1。然后是一個Promise,里面的函數(shù)是直接執(zhí)行的,因此應(yīng)該直接輸出 2 3 。然后,Promise的then應(yīng)當會放到當前tick的最后,但是還是在當前 tick 中。因此,應(yīng)當先輸出 5,然后再輸出 4 。最后在到下一個 tick,就是 1 。"2 3 5 4 1"