JavaScript中同步和異步之間的區(qū)別是什么-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)JavaScript中同步和異步之間的區(qū)別是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)長期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為善右企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),善右網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

javascript語言是一門“單線程”的語言,
不像java語言,類繼承Thread再來個thread.start就可以開辟一個線程。
所以,javascript就像一條流水線,僅僅是一條流水線而已,要么加工,要么包裝,不能同時進(jìn)行多個任務(wù)和流程。

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

“異步”呢,從字面來講,好像是在不同的(異)的ways上do something,
那首先想到的詞可能是“一邊...一邊...”,比如‘小明一邊吃雪糕一邊寫作業(yè)’,這完全沒毛病,雪糕吃完了,作業(yè)也寫完了,這就是異步?那就大錯特錯了!

其實(shí)同步和異步,
無論如何,做事情的時候都是只有一條流水線(單線程),
同步和異步的差別就在于這條流水線上各個流程的執(zhí)行順序不同。

最基礎(chǔ)的異步是setTimeout和setInterval函數(shù),
很常見,但是很少人有人知道其實(shí)這就是異步,
因?yàn)樗鼈兛梢钥刂苆s的執(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ū)別是什么

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

盡管setTimeout的time延遲時間為0,
其中的function也會被放入一個隊(duì)列中,等待下一個機(jī)會執(zhí)行,
當(dāng)前的代碼(指不需要加入隊(duì)列中的程序)必須在該隊(duì)列的程序完成之前完成,
因此結(jié)果可能不與預(yù)期結(jié)果相同。

這里說到了一個“隊(duì)列”(即任務(wù)隊(duì)列),
該隊(duì)列放的是什么呢,放的就是setTimeout中的function,
這些function依次加入該隊(duì)列,
即該隊(duì)列中所有function中的程序?qū)谠撽?duì)列以外的所有代碼執(zhí)行完畢之后再以此執(zhí)行,
這是為什么呢?因?yàn)樵趫?zhí)行程序的時候,瀏覽器會默認(rèn)setTimeout以及ajax請求這一類的方法都是耗時程序(盡管可能不耗時),
將其加入一個隊(duì)列中,該隊(duì)列是一個存儲耗時程序的隊(duì)列,在所有不耗時程序執(zhí)行過后,再來依次執(zhí)行該隊(duì)列中的程序。

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

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

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

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

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

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

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

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

  4. 主線程不斷重復(fù)上面的第三步。

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

"任務(wù)隊(duì)列"中的事件,除了IO設(shè)備的事件以外,
還包括一些用戶產(chǎn)生的事件(比如鼠標(biāo)點(diǎn)擊、頁面滾動等等),
比如$(selectot).click(function),這些都是相對耗時的操作。
只要指定過這些事件的回調(diào)函數(shù),這些事件發(fā)生時就會進(jìn)入"任務(wù)隊(duì)列",等待主線程讀取。

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

感謝各位的閱讀!關(guān)于JavaScript中同步和異步之間的區(qū)別是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前題目:JavaScript中同步和異步之間的區(qū)別是什么-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://bm7419.com/article14/cecdge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、定制開發(fā)、App設(shè)計(jì)、微信小程序、虛擬主機(jī)、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管