鍍金池/ 問答/HTML/ 關(guān)于js setTimeout alert阻塞進(jìn)程

關(guān)于js setTimeout alert阻塞進(jìn)程

前幾天看了關(guān)于這方面的一個(gè)問題 發(fā)現(xiàn)有些沒有理解


console.log(0,1,2,3,4)
for(let i=0;i<5;i++){
    setTimeout(function(){
        console.time();
        alert(i);
        console.info(i);
        console.timeEnd()
    },1000)
}

有什么規(guī)律可循嗎,如果可以希望再詳細(xì)講解一下 謝謝!
圖片描述

圖片描述

圖片描述

回答
編輯回答
傻叼

for循環(huán)并不會(huì)等待定時(shí)器執(zhí)行完在執(zhí)行.所以for循環(huán)執(zhí)行完之后,產(chǎn)生了(可以理解成線程)五個(gè)線程
然后這五個(gè)線程去搶奪cpu時(shí)間片,誰先搶到誰執(zhí)行,所以打印順序不一致.
在for循環(huán)后加一句console.log就可以看效果哦.

2017年2月21日 19:30
編輯回答
維她命

我說一下我的理解,希望能對(duì)你有所幫助!

首先,你先看一下這段代碼的執(zhí)行結(jié)果:

for (let i = 0; i < 5; i++) {
    setTimeout(function() {
        console.time();
        alert(i);
        console.info(i);
        console.timeEnd()
    }, i * 1000); //區(qū)別在這兒
}
這時(shí)候你會(huì)發(fā)現(xiàn)順序就對(duì)了,而且就算當(dāng)出現(xiàn)0時(shí),你過很久再去點(diǎn)確定,下一個(gè)數(shù)字1也不是馬上跳出來,而且順序號(hào)不會(huì)錯(cuò),這說明什么?我的理解是alert阻塞了代碼的執(zhí)行,整個(gè)程序的加載會(huì)停止在那兒

至于,你上面那個(gè)代碼,大家的時(shí)間都是相同的,阻塞之后,你點(diǎn)確定的時(shí)候,下一次出現(xiàn)的順序就存在不確定因素,因?yàn)檫@個(gè)和定時(shí)器延時(shí)按順序執(zhí)行不一樣,程序在第一個(gè)彈框時(shí)停止工作了,后面的事件大家時(shí)間都一樣,沒有按照原先的順序進(jìn)行排隊(duì),因此下一次的出現(xiàn)就會(huì)出現(xiàn)隨機(jī)性情況

另外,現(xiàn)在好多瀏覽器會(huì)對(duì)彈框進(jìn)行攔截,還有就是彈框次數(shù)過多也會(huì)進(jìn)行攔截,因此項(xiàng)目開發(fā)中盡量少用!

2017年7月7日 00:10