總結(jié):
1,先關(guān)注類型再關(guān)注值
2,一行不要做兩件事(拆)
一,
for (var i = 0; i < 5; i++) {
//下面是在執(zhí)行console的一個函數(shù)log(),輸出i,return出undefined的值,總的來說下面是在執(zhí)行函數(shù)(同立即執(zhí)行函數(shù))
console.log(i);
}
輸出:0,1,2,3,4
注意:
1,輸出結(jié)果和返回值是兩個 不同的值
2,說明console是一個對象
log()是console對象的一個函數(shù)
二,
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000 * i);
}
輸出:5個5
注意:
1,第一次循環(huán),設(shè)置了一個鬧鐘 0ms。第二次循環(huán),設(shè)置了一個鬧鐘1000ms。。。共設(shè)置了5個鬧鐘
2,注意setTimeout的作用是,鬧鐘時間到了,執(zhí)行函數(shù),下次時間到了,執(zhí)行函數(shù)。。。共執(zhí)行了5此函數(shù)
3,為什么5次輸出都是5呢?
因為console.log輸出的是一個全局變量i
實際情況是:
0毫秒 console.log(i) //i=0
1000毫秒 console.log(i) //i=1~4不定值
2000毫秒 console.log(i) //i=1~4不定值
3000毫秒 console.log(i) //i=1~4不定值
4000毫秒 console.log(i) //i=1~4不定值
最后:i的值是5,并且它可以被下次什么東西給執(zhí)行,這個時候循環(huán)結(jié)束,下面的執(zhí)行就是settimeout的作用了,它的作用是把設(shè)置的5個鬧鐘一次性敲響,敲響了5個,輸出i,但這個時候的i值已經(jīng)是5了
要記住,console.log輸出的是一個全局變量,所以會被后面的賦值覆蓋,但是這個是setTimeout,時間到,執(zhí)行函數(shù),所以積累了5個函數(shù)執(zhí)行動作要執(zhí)行,1000~4000應(yīng)該輸出的值不一定是確定的1,2,3,4,,但是,輸出的這個i,確定會被最后的5覆蓋。
三,
for (var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, i * 1000);
})(i);//傳入的這個i是每次循環(huán)的具體一個值,聲明是在for里面
}
根據(jù)上面的解釋,循環(huán)體里面是一個函數(shù)的執(zhí)行并且有形參
循環(huán)第一次,i=0:
傳入?yún)?shù)值0,第一步是var i「function(i)中的i」,第二步i=0,第三步console.log(i)等待輸出所以,這里把傳入的i保存下來了
循環(huán)第二次,i=1:
傳入?yún)?shù)值1,第一步是var i,第二步i=1,第三步console.log(i)等待輸出
。。。
所有輸出:0,1,2,3,4
重點:
1,所以,這里的i每次循環(huán)都在函數(shù)內(nèi)部聲明了一次,這里把傳入的i保存下來了
2,盡管最后一次的i=5,但是這個i值并不能覆蓋函數(shù)內(nèi)部的變量
四,
for (var i = 0; i < 5; i++) {
(function() {
setTimeout(function() {
console.log(i);
}, i * 1000);
})(i);
}
拆開:
這里,確確實實每次輸入的值是當(dāng)前循環(huán)的i但是,console.log(i),這個i是一個全局變量,所有最后的輸出會被最后的i值5全部覆蓋
五,
for (var i = 0; i < 5; i++) {
setTimeout((function(i) {
console.log(i);
})(i), i * 1000);
}
輸出:0,1,2,3,4
六,
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);
下面這句沒有任何意思,只是判斷而已
resolve()沒有任何返回值
i == 9999 && resolve();
步驟:
1,setTimeout入棧
2,聲明函數(shù) executor,打印2,new promise
3,for循環(huán)
4,等待for循環(huán)執(zhí)行完畢,打印 3,打印5
5,for執(zhí)行完后,調(diào)用Promise.resolve()