欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS內(nèi)部事件機制之單線程原理

 更新時間:2018年07月02日 11:35:14   投稿:mrr  
這篇文章主要介紹了JS內(nèi)部事件機制之單線程原理,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下

任務(wù)隊列

主線程:正在執(zhí)行的代碼,會生成函數(shù)調(diào)用棧。

  • macro-task(宏任務(wù),新名:task)包括:script(整體代碼), setTimeout, setInterval, setImmediate, I/O, UI rendering。
  • micro-task(微任務(wù),新名:jobs)包括: process.nextTick, Promise, Object.observe(已廢棄), MutationObserver(html5新特性,隊列中只能有一個)

任務(wù)分類

同步任務(wù),語句只按語句先后順序執(zhí)行,前面未執(zhí)行完,不會執(zhí)行后面語句。

異步任務(wù),語句不在語句先后順序上執(zhí)行,執(zhí)行到該代碼時,加入到相應(yīng)任務(wù)隊列,延后執(zhí)行。

單線程

主線程從 script (整體代碼)開始第一次循環(huán)。之后全局上下文進(jìn)入函數(shù)調(diào)用棧。直到調(diào)用棧清空(只剩全局),然后執(zhí)行所有的 jobs。當(dāng)所有可執(zhí)行的 jobs 執(zhí)行完畢之后。循環(huán)再次從 task 開始,找到其中一個任務(wù)隊列執(zhí)行完畢,然后再執(zhí)行所有的 jobs,這樣一直循環(huán)下去。

注意事項

  • setTimeout 最小間隔不能低于 4 毫秒,否則會自動增加。
  • DOM 的渲染每 16 毫秒執(zhí)行一次,因為顯示器是 60 Hz,16ms 刷新一次。
  • process.nextTick 任務(wù)會在 jobs 里單獨維護(hù)一個隊列,并且在其他 jobs 任務(wù)之前執(zhí)行。
  • 冒泡事件會直接在子元素事件執(zhí)行完成后,插入在主線程中。如果主線程不為空,那么會優(yōu)先于 jobs 執(zhí)行。

經(jīng)典示例

示例詳解:https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

通過鼠標(biāo)點擊

<div class="outer">
 <div class="inner"></div>
</div>
// Let's get hold of those elements
var outer = document.querySelector('.outer');
var inner = document.querySelector('.inner');
// Let's listen for attribute changes on the
// outer element
new MutationObserver(function() {
 console.log('mutate');
}).observe(outer, {
 attributes: true
});
// Here's a click listener…
function onClick() {
 console.log('click');
 setTimeout(function() {
  console.log('timeout');
 }, 0);
 Promise.resolve().then(function() {
  console.log('promise');
 });
 outer.setAttribute('data-random', Math.random());
}
// …which we'll attach to both elements
inner.addEventListener('click', onClick);
outer.addEventListener('click', onClick);
// 輸出結(jié)果
click
mutate
click
mutate
promise
promise
timeout
timeout

進(jìn)階--通過js執(zhí)行

<div class="outer">
 <div class="inner"></div>
</div>
// Let's get hold of those elements
var outer = document.querySelector('.outer');
var inner = document.querySelector('.inner');
// Let's listen for attribute changes on the
// outer element
new MutationObserver(function() {
 console.log('mutate');
}).observe(outer, {
 attributes: true
});
// Here's a click listener…
function onClick() {
 console.log('click');
 setTimeout(function() {
  console.log('timeout');
 }, 0);
 Promise.resolve().then(function() {
  console.log('promise');
 });
 outer.setAttribute('data-random', Math.random());
}
// …which we'll attach to both elements
inner.addEventListener('click', onClick);
outer.addEventListener('click', onClick);
inner.click();
// 輸出結(jié)果
click
click
mutate
promise
promise
timeout
timeout

由于點擊事件是 js 執(zhí)行的,inner 的 onClick 函數(shù)執(zhí)行完成時,inner.click() 語句的作用域還沒有退棧,主線程調(diào)用棧不是空的,導(dǎo)致 jobs 隊列任務(wù)不會執(zhí)行,mutate 和 promise 語句都未能在事件循環(huán)中執(zhí)行到。從而執(zhí)行了 outer 的 onClick 函數(shù)。outer 的 onClick 函數(shù)執(zhí)行完成后,inner.click() 語句才退棧,繼而執(zhí)行 jobs 的任務(wù)。

只有一個 mutate 是由于 jobs 隊列中,只能有一個 MutationObserver 任務(wù),第二次創(chuàng)建時,前一個 MutationObserver 任務(wù)沒有執(zhí)行,顧不再創(chuàng)建。

總結(jié)

以上所述是小編給大家介紹的JS內(nèi)部事件機制之單線程原理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • JS求解兩數(shù)之和算法詳解

    JS求解兩數(shù)之和算法詳解

    這篇文章主要介紹了JS求解兩數(shù)之和算法,結(jié)合實例形式詳細(xì)分析了JS求解兩數(shù)之和算法相關(guān)原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-04-04
  • JavaScript中附件預(yù)覽功能實現(xiàn)詳解(推薦)

    JavaScript中附件預(yù)覽功能實現(xiàn)詳解(推薦)

    這篇文章主要介紹了JavaScript中附件預(yù)覽功能的實現(xiàn),具體操作步驟大家可查看下文詳細(xì)講解,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • JavaScript中Object基礎(chǔ)內(nèi)部方法圖

    JavaScript中Object基礎(chǔ)內(nèi)部方法圖

    本篇文章通過一張詳細(xì)的JavaScript中Object基礎(chǔ)內(nèi)部方法圖介紹了其基本用法,需要的朋友參考下。
    2018-02-02
  • 詳談JS中實現(xiàn)種子隨機數(shù)及作用

    詳談JS中實現(xiàn)種子隨機數(shù)及作用

    這篇文章詳細(xì)介紹了種子隨機數(shù)在JS中如何實現(xiàn)以及有什么作用,希望能幫助有需要的人。下面一起來看看。
    2016-07-07
  • 基于JS對象創(chuàng)建常用方式及原理分析

    基于JS對象創(chuàng)建常用方式及原理分析

    下面小編就為大家?guī)硪黄贘S對象創(chuàng)建常用方式及原理分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • document.getElementById介紹

    document.getElementById介紹

    經(jīng)常使用document.getElementById,但對于更詳細(xì)的細(xì)節(jié)可以參考下。
    2011-09-09
  • 微信小程序Page中data數(shù)據(jù)操作和函數(shù)調(diào)用方法

    微信小程序Page中data數(shù)據(jù)操作和函數(shù)調(diào)用方法

    這篇文章主要介紹了微信小程序Page中data數(shù)據(jù)操作和函數(shù)調(diào)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • JS window對象簡單操作完整示例

    JS window對象簡單操作完整示例

    這篇文章主要介紹了JS window對象簡單操作,結(jié)合完整實例形式分析了JavaScript Window對象各種常見提示框、彈出窗口及時間相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • 詳解JavaScript原生封裝ajax請求和Jquery中的ajax請求

    詳解JavaScript原生封裝ajax請求和Jquery中的ajax請求

    在本篇文章中我們總結(jié)了關(guān)于JavaScript原生封裝ajax請求和Jquery中的ajax請求的知識點內(nèi)容,需要的朋友們學(xué)習(xí)參考下。
    2019-02-02
  • 使用原生js編寫一個簡單的框選功能方法

    使用原生js編寫一個簡單的框選功能方法

    這篇文章主要介紹了使用原生js編寫一個簡單的框選功能方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評論