1. 程式人生 > >理解js的同步操作與異步操作

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

set 同步 構建 帶來 不同的 系統 主線程 主任 script

字面誤區:1、js同步操作任務,並非一起操作之意;2、js異步操作任務,也並非是指在不同線程裏做不同的事情。

本質理解:首頁js的語言執行環境是單線程的,也就是一次只能完成一個任務,多個任務就必須按照時間先後排隊,前面完成後才能完成後一個任務。這個是js的常規模式,也就也是同步操作任務。

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

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

如下:

<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>

執行結果為:

1
5
2
3
4

那麽大致的運行機制如下:

(1)在js主程序(單線程)上的同步任務形成了一個主任務執行棧
(2)主線程之外還存在一個任務隊列,這個隊列存在一些按時間順序存放的事件,如鼠標點擊、計時觸發等,主線程中每出現一個異步任務,任務隊列就會增加一個異步任務的事件
(3)一般執行棧中的同步任務執行完畢,系統就會讀取任務隊列,看看哪些事件是可以執行的,一旦可以執行將進入執行棧開始執行
(4)主線程不斷重復

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