一、事件循环
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渲染
执行顺序如下:
- 执行同步代码,这是宏任务
- 执行栈为空,查询是否有微任务要执行
- 必要时渲染UI
- 进行下一轮的 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()
三、语句块的执行
我们比较常见的语句包括变量声明、表达式、条件、循环等。