国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

javascript - JS 程式碼非順序執(zhí)行語句 單步運(yùn)作正常,直接跑出問題
滿天的星座
滿天的星座 2017-06-26 10:50:14
0
4
779
  1. 想實(shí)現(xiàn) 彈框3s後自動(dòng)隱藏,我設(shè)定如下程式碼:

document.getElementById("alertMessageSel").style.display = "block";
document.getElementById("alertMessage").innerHTML = "兩次輸入手機(jī)號(hào)不一致!";
var t = Date.now();           
var t1 = Date.now() + 100;
while(t1 - t <= 3000) {
    t1 = Date.now();
};
document.getElementById("alertMessage").innerHTML = "";
document.getElementById("alertMessageSel").style.display = "none";

單步調(diào)試沒有問題,會(huì)順序執(zhí)行,我指的是打斷點(diǎn),效果和我想像一樣,但是不打斷點(diǎn)直接運(yùn)行就不會(huì)出現(xiàn)這個(gè)效果。
我想到了js在運(yùn)行過程中運(yùn)行應(yīng)該有自己的執(zhí)行方式。

2.想知道其中的運(yùn)作機(jī)制,想了解如何實(shí)現(xiàn),達(dá)到我預(yù)期的效果。

滿天的星座
滿天的星座

全部回覆(4)
巴扎黑

雷雷

劉奇

樓主的這個(gè),點(diǎn)擊顯示彈框的時(shí)候,添加一個(gè)settimeout間隔三秒後,自動(dòng)隱藏彈框或remove彈框?qū)?yīng)的結(jié)構(gòu)

小葫蘆

什麼是阻塞機(jī)制
Js阻塞機(jī)制,跟Js引擎的單執(zhí)行緒處理方式有關(guān),每個(gè)window一個(gè)JS執(zhí)行緒。所謂單線程,在某個(gè)特定的時(shí)刻只有特定的程式碼能夠被執(zhí)行,並且阻塞其它的程式碼。
由於瀏覽器是事件驅(qū)動(dòng)的(Event driven),因此瀏覽器中很多行為是異步(Asynchronized)的,很容易有事件被同時(shí)或連續(xù)觸發(fā)。當(dāng)非同步事件發(fā)生時(shí),會(huì)建立事件並放入執(zhí)行佇列中,等待目前程式碼執(zhí)行完成之後再執(zhí)行這些程式碼,如滑鼠點(diǎn)擊事件發(fā)生、計(jì)時(shí)器觸發(fā)事件發(fā)生、XMLHttpRequest完成回呼這些事件,都會(huì)被放入執(zhí)行隊(duì)列中等待。
關(guān)於Js的阻塞機(jī)制,可以看下面一段程式碼,一般,我們會(huì)認(rèn)為,這段程式碼會(huì)log出來0,1,2

for(var i=0;i

setTimeout(function(){
    console.log(i);
}, 10);

}
而實(shí)際上,這段程式碼log出來的結(jié)果是 3,3,3。這是js新手很容易遇到的問題,具體原因就是因?yàn)閒or迴圈的阻塞機(jī)制。在上面的程式碼中,setTimeout這個(gè)定時(shí)器需要等待for迴圈執(zhí)行完成,而for迴圈執(zhí)行完成了之後,i已經(jīng)為3了,此時(shí)才開始執(zhí)行setTimeout,因此console.log(i)會(huì)是3。
至於為什麼i會(huì)是3,請(qǐng)回顧for迴圈的執(zhí)行順序,當(dāng)i為2的時(shí)候,滿足迴圈條件,執(zhí)行程式碼區(qū)塊,然後i++,此時(shí)i為3,不滿足迴圈條件,不執(zhí)行程式碼區(qū)塊,循環(huán)停止。
對(duì)於for循環(huán),記住,是在不滿足條件的情況下停止循環(huán),對(duì)於以上程式碼,可以看出,i=3的時(shí)候才不滿足。
怎麼解決事件阻塞
其實(shí),阻塞作為js引擎的處理方式,我們最好不要想著解決“阻塞”,而是讓我們想執(zhí)行的程式碼,插入到“主執(zhí)行緒”中。這麼說比較不易理解,還是以上面的程式碼為例,直接上程式碼好了

for(var i=0;i

(function(i){
    setTimeout(function(){
        console.log(i);
    }, 10);
})(i)

再上面的程式碼中,我們加了一個(gè)立即執(zhí)行的匿名函數(shù),並且將for迴圈的i當(dāng)作實(shí)參傳入進(jìn)去。這樣,setTimeout就會(huì)立即執(zhí)行,而不會(huì)等待(這裡小編不太了解細(xì)節(jié),就不多說了,大概猜測(cè)為新開了一個(gè)臨時(shí)的線程,立即執(zhí)行匿名函數(shù),然後再立即切換回來) 。

大家講道理

為什麼不用定時(shí)器呢

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板