最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

任務(wù)隊(duì)列

主線(xiàn)程:正在執(zhí)行的代碼,會(huì)生成函數(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新特性,隊(duì)列中只能有一個(gè))

任務(wù)分類(lèi)

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

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

單線(xiàn)程

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

注意事項(xiàng)

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

經(jīng)典示例

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

通過(guò)鼠標(biāo)點(diǎn)擊

<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)階--通過(guò)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

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

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

總結(jié)

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

相關(guān)文章

  • IE下js調(diào)試工具Companion.JS

    IE下js調(diào)試工具Companion.JS

    做web開(kāi)發(fā)的朋友都清楚,js程序的調(diào)試是相當(dāng)郁悶的,因?yàn)槭紫冗@種語(yǔ)言語(yǔ)法比較靈活,它是一種弱類(lèi)型的腳本語(yǔ)言,很多錯(cuò)誤是無(wú)法控制的。
    2010-10-10
  • JavaScript設(shè)計(jì)模式之職責(zé)鏈模式應(yīng)用示例

    JavaScript設(shè)計(jì)模式之職責(zé)鏈模式應(yīng)用示例

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式之職責(zé)鏈模式,結(jié)合實(shí)例形式分析了javascript責(zé)任鏈模式的概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • Javascript變量作用域詳解

    Javascript變量作用域詳解

    這篇文章主要是對(duì)Javascript變量作用域進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • PHP捕捉異常中斷的方法

    PHP捕捉異常中斷的方法

    相信每位PHP程序員都知道,當(dāng)PHP程序出現(xiàn)異常情況,如出現(xiàn)致命錯(cuò)誤、超時(shí)或者不可知的邏輯錯(cuò)誤導(dǎo)致程序中斷,這個(gè)時(shí)候就可以用 register_shutdown_function進(jìn)行異常處理。下面本文給出了詳細(xì)的示例代碼,有需要的朋友們下面來(lái)一起看看吧。
    2016-10-10
  • 詳解JS異步加載的三種方式

    詳解JS異步加載的三種方式

    這篇文章主要介紹了詳解JS異步加載的三種方式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • JS簡(jiǎn)單判斷函數(shù)是否存在的方法

    JS簡(jiǎn)單判斷函數(shù)是否存在的方法

    這篇文章主要介紹了JS簡(jiǎn)單判斷函數(shù)是否存在的方法,涉及javascript函數(shù)運(yùn)行與類(lèi)型判定相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • jquery 實(shí)現(xiàn)上下滾動(dòng)效果示例代碼

    jquery 實(shí)現(xiàn)上下滾動(dòng)效果示例代碼

    上下滾動(dòng)的效果,不用說(shuō),大家都有看到過(guò),本文為大家介紹下使用jquery實(shí)現(xiàn)上下滾動(dòng)效果,感興趣的朋友可以參考下,希望對(duì)大家有所幫助
    2013-08-08
  • ECharts入門(mén)教程

    ECharts入門(mén)教程

    ECharts 是一個(gè)使用JavaScript實(shí)現(xiàn)的開(kāi)源可視化庫(kù),涵蓋各行業(yè)圖表,滿(mǎn)足各種需求。這篇文章介紹了ECharts的基礎(chǔ)知識(shí),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • JavaScript數(shù)據(jù)類(lèi)型的轉(zhuǎn)換詳解

    JavaScript數(shù)據(jù)類(lèi)型的轉(zhuǎn)換詳解

    JavaScript是一種動(dòng)態(tài)類(lèi)型語(yǔ)言,變量沒(méi)有類(lèi)型限制,可以隨時(shí)賦予任意值。本文就來(lái)和大家聊聊JavaScript中的數(shù)據(jù)類(lèi)型轉(zhuǎn)換,感興趣的小伙伴可以了解一下
    2022-12-12
  • BootStrap入門(mén)教程(二)之固定的內(nèi)置樣式

    BootStrap入門(mén)教程(二)之固定的內(nèi)置樣式

    這篇文章主要介紹了BootStrap入門(mén)教程(二)之固定的內(nèi)置樣式的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09

最新評(píng)論

特克斯县| 宿松县| 刚察县| 黔江区| 乌什县| 长汀县| 柘城县| 富蕴县| 张掖市| 关岭| 潼关县| 哈尔滨市| 新邵县| 海口市| 黄浦区| 宝清县| 嘉荫县| 玛纳斯县| 仁寿县| 宣城市| 元江| 都江堰市| 商水县| 新巴尔虎右旗| 彭阳县| 定南县| 上虞市| 蒙自县| 寻乌县| 宁明县| 法库县| 枣阳市| 云林县| 福贡县| 秦安县| 长海县| 全南县| 增城市| 连南| 宁晋县| 汤阴县|