老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

JavaScript運行機制是什么

這篇文章主要為大家展示了JavaScript運行機制是什么,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

創新互聯從2013年創立,先為鎮巴等服務建站,鎮巴等地企業,進行企業商務咨詢服務。為鎮巴企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

JavaScript執行順序

首先,JavaScript是按照順序,一行一行執行的,且JS只有一條線程,即不可能進行兩條代碼同時執行,也就是說,在一條代碼執行時,它后面的所有代碼都需要等待,直到該代碼執行結束,后面的才能繼續執行。如果是這樣,就會導致用戶體驗度極其不好,例如一個請求發送給服務器,后續代碼就會一直等待,直到服務器返回結果,用戶才能進行新的操作。

這又是怎么回事呢?

詳細解釋JavaScript執行機制

JavaScript執行棧

JavaScript是以壓棧的方式進行代碼的執行的,一開始執行時棧內為空,當執行開始,JS引擎會將代碼放入棧底,若該代碼包含其他函數的調用,則將被調用的函數放在棧頂,若該代碼未包含其他函數的調用,則執行該函數,執行完成后出棧,以此類推,最終直到棧為空。

JavaScript的同步任務和異步任務

事實上,真正的JS內部分為同步任務和異步任務,然而這并沒有改變JS單線程的特征。

  • 同步任務:執行后直接返回結果,例:console.log();c = a + b
  • 異步任務:執行后無法立刻返回結果,需要等待一定時間,才能執行回調函數,對返回結果進行操作

系統來說,JS存在一個主線程,它會首先執行所有同步任務,而異步任務都會先進行注冊,然后主線程不會等待異步任務執行結果的返回,而是繼續執行下面的同步任務(在此過程中,如果異步任務返回結果,接下來的回調函數會放在Event Queue中等待),直到同步任務全部執行完畢,主線程就會從Event Queue讀取任務進行執行。該過程會不斷循環,即事件循環Event Loop。

事件循環是如何發生的

不覺得奇怪嗎,如果按照上述同步任務和異步任務的執行方式,那不是一輪就可以執行完畢嗎,又何來的Event Loop?

這是個小細節,異步任務存在多個時,每一個異步任務返回的結果所需的時間都是不同的,這就存在Event Queue以先進先出的形式將返回結果進行排隊,第一個異步任務返回結果,那么就將其放在隊列的首位,接下來的異步任務緊隨其后,就這樣排成一隊。當主線程空閑時(即同步任務執行完畢后),便從Event Queue中讀取事件,放入主線程執行。而循環來自于,當Event Queue執行完畢后,過了一段時間,又有之前的異步任務返回結果,放到Event Queue中,監控器檢測到Event Queue為非空,主線程又開始執行Event Queue中的任務。

宏任務和微任務

在解釋定義之前,我們先對異步任務進行說明:

  1. 對服務器的異步請求:最常見的異步任務,這涉及前后端的交互,需要服務器對請求進行處理,并返回請求結果
  2. setTimeout和setInterval:延時操作,后者為循環操作(都涉及延時值)
  3. Promise:JS用來處理異步操作的對象
  4. process.nextTick(callback):類似node.js版的"setTimeout",在事件循環的下一次循環中調用 callback 回調函數。

廣義上JS分為同步任務和異步任務,在此對任務進行更精細的定義:

  • macro-task(宏任務):包括整體代碼script,setTimeout,setInterval
  • micro-task(微任務):Promise,process.nextTick

在此,之所以提出宏任務和微任務,是為了更好的理解事件循環!

執行過程:

  • 主線程會按順序先執行第一次循環的宏任務,然后將第一次循環遇到的微任務放入微任務的Event Queue中,將遇到的宏任務放入宏任務Event Queue中,在此特別注意!!第一次循環的宏任務是整體script代碼!!;
  • 然后后執行微任務的Event Queue;
  • 第二次循環時,會從宏任務的Event Queue中取出第一個宏任務,然后執行當前宏任務中包含的代碼,同樣將遇到的微任務放入微任務的Event Queue中,將遇到的宏任務放入宏任務Event Queue中;
  • 再執行當前微任務的Event Queue中的任務;
  • 第三次循環,從宏任務的Event Queue中取出第二個宏任務…(以此循環)

簡而言之,就是先執行宏任務,再執行微任務,特別注意兩點即可:

  1. 第一次循環的宏任務是整體script代碼
  2. 宏任務隊列是一次循環執行一條宏任務

這里看個例子:

 console.log('1');
 
 setTimeout(function() {
  console.log('2');
  process.nextTick(function() {
   console.log('3');
  })
  new Promise(function(resolve) {
   console.log('4');
   resolve();
  }).then(function() {
   console.log('5')
  })
 })
 process.nextTick(function() {
  console.log('6');
 })
 new Promise(function(resolve) {
  console.log('7');
  resolve();
 }).then(function() {
  console.log('8')
 })
 
 setTimeout(function() {
  console.log('9');
  process.nextTick(function() {
   console.log('10');
  })
  new Promise(function(resolve) {
   console.log('11');
   resolve();
  }).then(function() {
   console.log('12')
  })
 })
 
 //作者:ssssyoki
 //鏈接:https://juejin.im/post/59e85eebf265da430d571f89
 //來源:掘金

輸出順序為:

1,7,6,8,2,4,3,5,9,11,10,12

以上就是關于JavaScript運行機制是什么的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。


當前題目:JavaScript運行機制是什么
瀏覽路徑:http://www.xueling.net.cn/article/pdseoh.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 99久久欧美日韩国产二区 | 久久天天躁狠狠躁夜夜2020 | 青青草午夜色影院 | 成年男人裸j网站 | 欧美日韩精品在线免费观看 | 丁香久久婷婷 | 在线免费观看视频一区二区 | 国产性色 | 国产精品合集久久久久青苹果 | 男人操女人视频免费看 | 制服丝袜中文字幕第一页 | 尤物网精品视频 | 5252aⅴhaose我爱久久 | av在线免费观看国产 | 日韩人妻中文无码一区二区三区 | 囯产无码大放纵视频 | 成人欧美一区二区三区色青冈 | 亚洲AV无码无一区二区三区 | 精品国产一区二区三区四区阿崩 | youjizz丰满熟妇 | 99国产精品人妻无码免费农村 | 大地资源中文二页在线观看 | 精品av天堂毛片久久久 | 国产va免费精品高清在线 | 555www色欧美视频 | 在线看免费无码AV天堂 | 人人草人人澡 | 老师洗澡让我吃她胸视频 | 96sao在线精品视频 | 欧美黑人又粗又大一级A片 一级黄色片免费播放 | 国产a级大片 | 午夜伦理av| 成人日韩精品 | 精品乱码一区二区三四区 | 日本专区在线 | 国产亚洲精品久久久久久豆腐 | 看片网站在线观看 | 不卡国产| 亚洲精品无码永久在线观看 | 精品国产a∨无码一区二区三区 | 视频一区在线 |