描述Event Loop机制
简单:
JS在执行代码时候,遇到同步代码放到执行栈中立即执行,遇到异步代码先挂起不执行。等执行栈空(同步代码都执行玩),Event Loop就会把挂起的异步代码放入执行栈中循环执行知道代码都被执行完

详细:
- 执行代码
- 同步代码放到执行栈中执行
- 遇到异步代码先判断是微任务还是宏任务,把它们放到不同的待执行队列
- 执行栈空
- 循环执行微任务队列
- 必要的话UI渲染
- 循环执行宏任务队列

示例代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="main"></div>
<script>
// 微任务在dom渲染前触发,宏任务在dom渲染后触发
// 下面例子证明微任务(Promise)在宏任务(setTimeout)之前触发
const main = document.querySelector('.main')
const content = document.createDocumentFragment()
content.appendChild(document.createElement('button'))
content.appendChild(document.createElement('div'))
content.appendChild(document.createElement('p'))
main.appendChild(content)
console.log('main.childNodes dom 已生成');
console.log(main.childNodes);
Promise.resolve()
.then(() => {
alert('Promise1 dom 渲染前')
})
Promise.resolve()
.then(() => {
alert('Promise2 dom 渲染前')
})
setTimeout(() => {
alert('setTimeout1 dom 渲染后')
}, 0);
setTimeout(() => {
alert('setTimeou2 dom 渲染后')
}, 0);
</script>
</body>
</html>