JS中的同步與異步

首先,js是單線(xiàn)程的,這一點(diǎn)毋庸置疑。

同步異步的概念:
同步:大家按照順序,你運(yùn)行完我運(yùn)行,不存在你我同時(shí)運(yùn)行的情況;優(yōu)點(diǎn)是實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,執(zhí)行環(huán)境相對(duì)單純;壞處是一旦出現(xiàn)耗時(shí)操作就會(huì)導(dǎo)致整個(gè)程序癱瘓,停止運(yùn)行;
異步:大家齊頭并進(jìn),一起運(yùn)行,也就是明面上的“多線(xiàn)程”;

既然異步就約等于多線(xiàn)程,那js這樣一個(gè)單線(xiàn)程語(yǔ)言中,怎么會(huì)存在異步呢?其實(shí)實(shí)際上js確實(shí)不存在真正意義上的“異步”,而是使用 events loop 來(lái)實(shí)現(xiàn)類(lèi)似異步的效果。events loop 實(shí)際上就是在js在主要代碼(也就是在html中所有定義的script標(biāo)簽)運(yùn)行完后,會(huì)開(kāi)啟的一個(gè)循環(huán),主要用于監(jiān)聽(tīng) HTML 事件和執(zhí)行異步操作。所以實(shí)際上js就是單線(xiàn)程的,包括setTimeout,setInterval,XMLHttpRequest都是如此的操作:將需要執(zhí)行的耗時(shí)操作放入循環(huán)中,并在恰當(dāng)實(shí)際執(zhí)行回調(diào)函數(shù)。

我們可以用以下代碼來(lái)測(cè)試js一定是單線(xiàn)程:

setTImeout(function(){
    alert("我是一個(gè)彈窗");
},1000);
while(true){
    //不會(huì)結(jié)束的死循環(huán)
}

js有多種方法來(lái)實(shí)現(xiàn)偽異步,比如:回調(diào)函數(shù),事件監(jiān)聽(tīng),發(fā)布訂閱,Promises對(duì)象。
回調(diào)函數(shù)就是上述的setTimeoutsetInterval,XMLHttpRequest所使用的方法,傳入一個(gè)函數(shù),并在耗時(shí)操作完成時(shí)執(zhí)行。
事件監(jiān)聽(tīng)就是設(shè)定幾個(gè)事件,為其設(shè)置監(jiān)聽(tīng)事件,當(dāng)某個(gè)事件發(fā)生時(shí),執(zhí)行對(duì)應(yīng)的函數(shù)。
發(fā)布訂閱這個(gè)模式與安卓中的廣播類(lèi)似,可以通過(guò)一個(gè)“平臺(tái)”來(lái)“發(fā)布”某些信息,之后會(huì)將這個(gè)調(diào)用所有“訂閱”這個(gè)信息的函數(shù),與事件監(jiān)聽(tīng)很像,但是可以通過(guò)從消息中心(其實(shí)就是)查看來(lái)更好的監(jiān)控程序。
Promises函數(shù),每一個(gè)異步任務(wù)返回一個(gè)Promise對(duì)象,該對(duì)象有一個(gè)then方法,允許指定回調(diào)函數(shù),會(huì)在上一個(gè)世界結(jié)束后調(diào)用。(詳細(xì)可以查看菜鳥(niǎo)教程等)
其實(shí)看完你會(huì)發(fā)現(xiàn),所有在js中的“異步”操作,都是耗時(shí)操作加入事件循環(huán),并在特定時(shí)機(jī)執(zhí)行一個(gè)函數(shù)的模式。
原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 在平日的編碼中,你能列出你常用的異步編碼?怎么理解同步與異步? 如果僅僅停留在文字上的理解,個(gè)人覺(jué)得有口無(wú)心...
    itclanCoder閱讀 598評(píng)論 0 1
  • 1.個(gè)人覺(jué)得,js中,最基礎(chǔ)的異步是setTimeout和setInterval函數(shù),很常見(jiàn),但是很少人有人知道其...
    神秘者007閱讀 581評(píng)論 0 0
  • 你應(yīng)該知道,javascript語(yǔ)言是一門(mén)“單線(xiàn)程”的語(yǔ)言,不像java語(yǔ)言,類(lèi)繼承Thread再來(lái)個(gè)thread...
    別人家的xiao孩閱讀 1,364評(píng)論 2 34
  • 目錄 1. 在JS中,什么是同步異步? 2. JS中常見(jiàn)的異步代碼 1. 在JS中,什么是同步異步? 通俗解釋一下...
    臨安linan閱讀 5,170評(píng)論 0 6
  • JS是單線(xiàn)程的同步:指的是等待一件事情完成之后才會(huì)去執(zhí)行下一件事,JS中大部分都是同步編程。循環(huán)就是同步的,所以在...
    沒(méi)了提心吊膽的稗子閱讀 381評(píng)論 0 0

友情鏈接更多精彩內(nèi)容