久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      javascript中異步和同步的區(qū)別是什么

      區(qū)別:在同步中,發(fā)出一個(gè)功能調(diào)用時(shí),必須一件一件事做,等前一件做完了才能做下一件事;而在異步中,當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者在沒(méi)有得到結(jié)果之前,就可以繼續(xù)執(zhí)行后續(xù)操作。

      javascript中異步和同步的區(qū)別是什么

      本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。

      javascript語(yǔ)言是一門(mén)“單線(xiàn)程”的語(yǔ)言,

      不像java語(yǔ)言,類(lèi)繼承Thread再來(lái)個(gè)thread.start就可以開(kāi)辟一個(gè)線(xiàn)程。

      所以,javascript就像一條流水線(xiàn),僅僅是一條流水線(xiàn)而已,要么加工,要么包裝,不能同時(shí)進(jìn)行多個(gè)任務(wù)和流程。

      “同步”——一下就讓人想到“一起”這個(gè)詞;


      “異步”呢,從字面來(lái)講,好像是在不同的(異)的ways上do something,

      那首先想到的詞可能是“一邊…一邊…”,比如‘小明一邊吃雪糕一邊寫(xiě)作業(yè)’,這完全沒(méi)毛病,雪糕吃完了,作業(yè)也寫(xiě)完了,這就是異步?那就大錯(cuò)特錯(cuò)了!


      其實(shí)同步和異步,

      無(wú)論如何,做事情的時(shí)候都是只有一條流水線(xiàn)(單線(xiàn)程),

      同步和異步的差別就在于這條流水線(xiàn)上各個(gè)流程的執(zhí)行順序不同。

      最基礎(chǔ)的異步是setTimeout和setInterval函數(shù),

      很常見(jiàn),但是很少人有人知道其實(shí)這就是異步,

      因?yàn)樗鼈兛梢钥刂苆s的執(zhí)行順序。我們也可以簡(jiǎn)單地理解為:

      可以改變程序正常執(zhí)行順序的操作就可以看成是異步操作。如下代碼:

          console.log( "1" );     setTimeout(function() {         console.log( "2" )     }, 0 );     setTimeout(function() {         console.log( "3" )     }, 0 );     setTimeout(function() {         console.log( "4" )     }, 0 );     console.log( "5" );

      輸出順序是什么呢?

      javascript中異步和同步的區(qū)別是什么

      可見(jiàn),盡管我們?cè)O(shè)置了setTimeout(function,time)中的等待時(shí)間為0,結(jié)果其中的function還是后執(zhí)行。

      盡管setTimeout的time延遲時(shí)間為0,

      其中的function也會(huì)被放入一個(gè)隊(duì)列中,等待下一個(gè)機(jī)會(huì)執(zhí)行,

      當(dāng)前的代碼(指不需要加入隊(duì)列中的程序)必須在該隊(duì)列的程序完成之前完成,

      因此結(jié)果可能不與預(yù)期結(jié)果相同。

      這里說(shuō)到了一個(gè)“隊(duì)列”(即任務(wù)隊(duì)列),

      該隊(duì)列放的是什么呢,放的就是setTimeout中的function,

      這些function依次加入該隊(duì)列,

      即該隊(duì)列中所有function中的程序?qū)?huì)在該隊(duì)列以外的所有代碼執(zhí)行完畢之后再以此執(zhí)行,

      這是為什么呢?因?yàn)樵趫?zhí)行程序的時(shí)候,瀏覽器會(huì)默認(rèn)setTimeout以及ajax請(qǐng)求這一類(lèi)的方法都是耗時(shí)程序(盡管可能不耗時(shí)),
      將其加入一個(gè)隊(duì)列中,該隊(duì)列是一個(gè)存儲(chǔ)耗時(shí)程序的隊(duì)列,在所有不耗時(shí)程序執(zhí)行過(guò)后,再來(lái)依次執(zhí)行該隊(duì)列中的程序。

      又回到了最初的起點(diǎn)——javascript是單線(xiàn)程。 單線(xiàn)程就意味著,所有任務(wù)需要排隊(duì),前一個(gè)任務(wù)結(jié)束,才會(huì)執(zhí)行后一個(gè)任務(wù)。
      如果前一個(gè)任務(wù)耗時(shí)很長(zhǎng),后一個(gè)任務(wù)就不得不一直等著。

      于是就有一個(gè)概念——任務(wù)隊(duì)列。如果排隊(duì)是因?yàn)橛?jì)算量大,CPU忙不過(guò)來(lái),倒也算了,

      但是很多時(shí)候CPU是閑著的,因?yàn)镮O設(shè)備(輸入輸出設(shè)備)很慢(比如Ajax操作從網(wǎng)絡(luò)讀取數(shù)據(jù)),不得不等著結(jié)果出來(lái),再往下執(zhí)行。于是JavaScript語(yǔ)言的設(shè)計(jì)者意識(shí)到,這時(shí)主線(xiàn)程完全可以不管IO設(shè)備,掛起處于等待中的任務(wù),先運(yùn)行排在后面的任務(wù)。等到IO設(shè)備返回了結(jié)果,再回過(guò)頭,把掛起的任務(wù)繼續(xù)執(zhí)行下去。

      于是,所有任務(wù)可以分成兩種,

      一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous)。 同步任務(wù)指的是,在主線(xiàn)程上排隊(duì)執(zhí)行的任務(wù),
      只有前一個(gè)任務(wù)執(zhí)行完畢,才能執(zhí)行后一個(gè)任務(wù); 異步任務(wù)指的是,不進(jìn)入主線(xiàn)程、而進(jìn)入"任務(wù)隊(duì)列"(task queue)的任務(wù),只有等主線(xiàn)程任務(wù)執(zhí)行完畢,"任務(wù)隊(duì)列"開(kāi)始通知主線(xiàn)程,請(qǐng)求執(zhí)行任務(wù),該任務(wù)才會(huì)進(jìn)入主線(xiàn)程執(zhí)行。

      具體來(lái)說(shuō),異步運(yùn)行機(jī)制如下:


      • 所有同步任務(wù)都在主線(xiàn)程上執(zhí)行,形成一個(gè)執(zhí)行棧(execution context stack)。

      • 主線(xiàn)程之外,還存在一個(gè)"任務(wù)隊(duì)列"(task queue)。只要異步任務(wù)有了運(yùn)行結(jié)果,就在"任務(wù)隊(duì)列"之中放置一個(gè)事件。

      • 一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)讀取"任務(wù)隊(duì)列",看看里面有哪些事件。那些對(duì)應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧,開(kāi)始執(zhí)行。

      • 主線(xiàn)程不斷重復(fù)上面的第三步。


      只要主線(xiàn)程空了,就會(huì)去讀取"任務(wù)隊(duì)列",這就是JavaScript的運(yùn)行機(jī)制。這個(gè)過(guò)程會(huì)不斷重復(fù)。

      "任務(wù)隊(duì)列"中的事件,除了IO設(shè)備的事件以外,

      還包括一些用戶(hù)產(chǎn)生的事件(比如鼠標(biāo)點(diǎn)擊、頁(yè)面滾動(dòng)等等),

      比如$(selectot).click(function),這些都是相對(duì)耗時(shí)的操作。

      只要指定過(guò)這些事件的回調(diào)函數(shù),這些事件發(fā)生時(shí)就會(huì)進(jìn)入"任務(wù)隊(duì)列",等待主線(xiàn)程讀取。

      所謂"回調(diào)函數(shù)"(callback),就是那些會(huì)被主線(xiàn)程掛起來(lái)的代碼,前面說(shuō)的點(diǎn)擊事件$(selectot).click(function)中的function就是一個(gè)回調(diào)函數(shù)。異步任務(wù)必須指定回調(diào)函數(shù),當(dāng)主線(xiàn)程開(kāi)始執(zhí)行異步任務(wù),就是執(zhí)行對(duì)應(yīng)的回調(diào)函數(shù)。例如ajax的success,complete,error也都指定了各自的回調(diào)函數(shù),這些函數(shù)就會(huì)加入“任務(wù)隊(duì)列”中,等待執(zhí)行。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)