久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放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. 站長資訊網
      最全最豐富的資訊網站

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

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

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

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

      javascript語言是一門“單線程”的語言,

      不像java語言,類繼承Thread再來個thread.start就可以開辟一個線程。

      所以,javascript就像一條流水線,僅僅是一條流水線而已,要么加工,要么包裝,不能同時進行多個任務和流程。

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


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

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


      其實同步和異步,

      無論如何,做事情的時候都是只有一條流水線(單線程),

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

      最基礎的異步是setTimeout和setInterval函數,

      很常見,但是很少人有人知道其實這就是異步,

      因為它們可以控制js的執(zhí)行順序。我們也可以簡單地理解為:

      可以改變程序正常執(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ū)別是什么

      可見,盡管我們設置了setTimeout(function,time)中的等待時間為0,結果其中的function還是后執(zhí)行。

      盡管setTimeout的time延遲時間為0,

      其中的function也會被放入一個隊列中,等待下一個機會執(zhí)行,

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

      因此結果可能不與預期結果相同。

      這里說到了一個“隊列”(即任務隊列),

      該隊列放的是什么呢,放的就是setTimeout中的function,

      這些function依次加入該隊列,

      即該隊列中所有function中的程序將會在該隊列以外的所有代碼執(zhí)行完畢之后再以此執(zhí)行,

      這是為什么呢?因為在執(zhí)行程序的時候,瀏覽器會默認setTimeout以及ajax請求這一類的方法都是耗時程序(盡管可能不耗時),
      將其加入一個隊列中,該隊列是一個存儲耗時程序的隊列,在所有不耗時程序執(zhí)行過后,再來依次執(zhí)行該隊列中的程序。

      又回到了最初的起點——javascript是單線程。 單線程就意味著,所有任務需要排隊,前一個任務結束,才會執(zhí)行后一個任務。
      如果前一個任務耗時很長,后一個任務就不得不一直等著。

      于是就有一個概念——任務隊列。如果排隊是因為計算量大,CPU忙不過來,倒也算了,

      但是很多時候CPU是閑著的,因為IO設備(輸入輸出設備)很慢(比如Ajax操作從網絡讀取數據),不得不等著結果出來,再往下執(zhí)行。于是JavaScript語言的設計者意識到,這時主線程完全可以不管IO設備,掛起處于等待中的任務,先運行排在后面的任務。等到IO設備返回了結果,再回過頭,把掛起的任務繼續(xù)執(zhí)行下去。

      于是,所有任務可以分成兩種,

      一種是同步任務(synchronous),另一種是異步任務(asynchronous)。 同步任務指的是,在主線程上排隊執(zhí)行的任務,
      只有前一個任務執(zhí)行完畢,才能執(zhí)行后一個任務; 異步任務指的是,不進入主線程、而進入"任務隊列"(task queue)的任務,只有等主線程任務執(zhí)行完畢,"任務隊列"開始通知主線程,請求執(zhí)行任務,該任務才會進入主線程執(zhí)行。

      具體來說,異步運行機制如下:


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

      • 主線程之外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件。

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

      • 主線程不斷重復上面的第三步。


      只要主線程空了,就會去讀取"任務隊列",這就是JavaScript的運行機制。這個過程會不斷重復。

      "任務隊列"中的事件,除了IO設備的事件以外,

      還包括一些用戶產生的事件(比如鼠標點擊、頁面滾動等等),

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

      只要指定過這些事件的回調函數,這些事件發(fā)生時就會進入"任務隊列",等待主線程讀取。

      所謂"回調函數"(callback),就是那些會被主線程掛起來的代碼,前面說的點擊事件$(selectot).click(function)中的function就是一個回調函數。異步任務必須指定回調函數,當主線程開始執(zhí)行異步任務,就是執(zhí)行對應的回調函數。例如ajax的success,complete,error也都指定了各自的回調函數,這些函數就會加入“任務隊列”中,等待執(zhí)行。

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