[2] JS执行过程

76 阅读1分钟

image.png

一、事件循环

1.1 背景知识

形成一个感性的认知:一个 JavaScript 引擎会常驻于内存中,它等待着我们(宿主)把 JavaScript 代码或者函数传递给它执行

我们把宿主发起的任务称为宏观任务,把 JavaScript 引擎发起的任务称为微观任务。许多的微观任务的队列组成了宏观任务。

1.2 宏任务vs微任务

JavaScript 必须保证这些异步代码在一个宏观任务中完成,因此,每个宏观任务中又包含了一个微观任务队列。

微任务(microtask)

  • process.nextTick
  • promise.then()
  • Object.observe(曾经是提案,如今已经废除)
  • MutationOberver

宏任务(macrotask)

  • script
  • setTimeout
  • setInterval
  • setImmediate
  • I/O
  • UI渲染

执行顺序如下:

  1. 执行同步代码,这是宏任务
  2. 执行栈为空,查询是否有微任务要执行
  3. 必要时渲染UI
  4. 进行下一轮的 EventLoop ,执行宏任务中的异步代码

二、函数的执行

在 JavaScript,切换上下文最主要的场景是函数调用。

tihs,指向问题。

默认:在严格模式下绑定到undefined,否则绑定到全局对象。

"use strict";
var age = 13 // var 是全局变量,挂在window上。这是一定的
function test() {
    console.log(window.age) // 13
    console.log(this) // 非严格模式window,严格模式undefined 。undefined
    console.log(this.age) // 报错
}
test()

三、语句块的执行

我们比较常见的语句包括变量声明、表达式、条件、循环等。