描述Event Loop机制

简单:

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

1

详细:

  1. 执行代码
  2. 同步代码放到执行栈中执行
  3. 遇到异步代码先判断是微任务还是宏任务,把它们放到不同的待执行队列
  4. 执行栈空
  5. 循环执行微任务队列
  6. 必要的话UI渲染
  7. 循环执行宏任务队列

2

示例代码:

<!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>

results matching ""

    No results matching ""