溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

理解js的同步操作與異步操作

發(fā)布時間:2020-08-04 19:08:08 來源:網(wǎng)絡(luò) 閱讀:1068 作者:daydaydream 欄目:web開發(fā)

字面誤區(qū):1、js同步操作任務(wù),并非一起操作之意;2、js異步操作任務(wù),也并非是指在不同線程里做不同的事情。

本質(zhì)理解:首頁js的語言執(zhí)行環(huán)境是單線程的,也就是一次只能完成一個任務(wù),多個任務(wù)就必須按照時間先后排隊,前面完成后才能完成后一個任務(wù)。這個是js的常規(guī)模式,也就也是同步操作任務(wù)。

弊端:同步操作任務(wù)帶來的問題是,只要一個任務(wù)執(zhí)行時間過程,后面的任務(wù)都會排隊等待,拖延整個程序的執(zhí)行,如:常見的瀏覽器假死很可能就是js任務(wù)執(zhí)行時間太長導(dǎo)致。

為了解決同步操作帶來的弊端,js語言增加了異步任務(wù)的操作模式:當前任務(wù)可以攜帶回一個回調(diào)函數(shù)(當前任務(wù)執(zhí)行時間過長,把需要提前執(zhí)行的任務(wù)放在回掉中);可以利用setTimeout構(gòu)建異步任務(wù),讓主邏輯優(yōu)先執(zhí)行,對于耗時間長的任務(wù)可以放在setTimeout中異步執(zhí)行。所以異步操作任務(wù)主要是改變了程序的正常執(zhí)行操作順序。

如下:

<script type="text/javascript">
console.log("1")
setTimeout(function(){
console.log("2")
},0)
setTimeout(function(){
console.log("3")
},0)
setTimeout(function(){
console.log("4")
},0)
console.log("5")

</script>

執(zhí)行結(jié)果為:

1
5
2
3
4

那么大致的運行機制如下:
(1)在js主程序(單線程)上的同步任務(wù)形成了一個主任務(wù)執(zhí)行棧
(2)主線程之外還存在一個任務(wù)隊列,這個隊列存在一些按時間順序存放的事件,如鼠標點擊、計時觸發(fā)等,主線程中每出現(xiàn)一個異步任務(wù),任務(wù)隊列就會增加一個異步任務(wù)的事件
(3)一般執(zhí)行棧中的同步任務(wù)執(zhí)行完畢,系統(tǒng)就會讀取任務(wù)隊列,看看哪些事件是可以執(zhí)行的,一旦可以執(zhí)行將進入執(zhí)行棧開始執(zhí)行
(4)不斷重復(fù)以上動作

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI