国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JS內部事件機制之單線程原理

2024-05-06 15:33:00
字體:
來源:轉載
供稿:網友

任務隊列

主線程:正在執行的代碼,會生成函數調用棧。

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

任務分類

同步任務,語句只按語句先后順序執行,前面未執行完,不會執行后面語句。

異步任務,語句不在語句先后順序上執行,執行到該代碼時,加入到相應任務隊列,延后執行。

單線程

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

注意事項

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

經典示例

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

通過鼠標點擊

<div class="outer"> <div class="inner"></div></div>// Let's get hold of those elementsvar outer = document.querySelector('.outer');var inner = document.querySelector('.inner');// Let's listen for attribute changes on the// outer elementnew 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 elementsinner.addEventListener('click', onClick);outer.addEventListener('click', onClick);// 輸出結果clickmutateclickmutatepromisepromisetimeouttimeout

進階--通過js執行

<div class="outer"> <div class="inner"></div></div>// Let's get hold of those elementsvar outer = document.querySelector('.outer');var inner = document.querySelector('.inner');// Let's listen for attribute changes on the// outer elementnew 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 elementsinner.addEventListener('click', onClick);outer.addEventListener('click', onClick);inner.click();// 輸出結果clickclickmutatepromisepromisetimeouttimeout            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 铜鼓县| 平泉县| 东乌| 恩平市| 勐海县| 沛县| 定边县| 晴隆县| 芷江| 阿勒泰市| 壤塘县| 长宁区| 镇安县| 板桥市| 滁州市| 柘荣县| 郎溪县| 怀远县| 赤峰市| 鹿泉市| 赣榆县| 都昌县| 通道| 凤台县| 承德县| 宁陵县| 司法| 阜南县| 郁南县| 花莲市| 连南| 岳池县| 虞城县| 都昌县| 江阴市| 安吉县| 花莲县| 巫溪县| 和林格尔县| 板桥市| 东乡县|