# 二.JS 高级
# 1.执行机制
# 1.1 同步和异步
- 同步:
- 由于 js 单线程,同步任务都在主线程上排队执行,前面任务没有执行完成,后面的任务会一直等待
- 异步:
- 不进入主线程,进入任务队列,等待主线程任务执行完成,才开始执行。最基本的异步操作 setTimeout 和 setInterval,等待主线程任务执行完,再开始执行里面的函数。
- 浏览器和 Node 环境下,microtask 任务队列的执行时机不同
- Node.js 中,microtask 在事件循环的各个阶段之间执行
- 浏览器端,microtask 在事件循环的 macrotask 执行完之后执行
- 递归的调用 process.nextTick()会导致 I/O starving,官方推荐使用 setImmediate()
# 1.2 作用域
一套管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称(标识符就是变量或者函数名)查找变量的规则;
只有全局作用域和局部作用域(es6 中加入块级作用域),作用域在他创建的时候就存在了
什么是作用域链
- 由当前环境与上一层环境的一系列变量对象组成,保证当前执行环境里有权访问的变量和函数是有序的,作用域变量只能被向上访问
- 变量访问到 window 对象即被终止,作用域链向下访问是不被允许的
改变作用方式有
- 变量访问到 window 对象即被终止,作用域链向下访问时不允许的
- 1.改变作用域由 with try...中 catch
- 2.所有格未定义的直接赋值的变量自动声明为全局作用域。
- 变量访问到 window 对象即被终止,作用域链向下访问时不允许的
代码执行分为两个阶段:
- 代码编译阶段:
- 由编译器完成,将代码翻译成可执行的代码,这个阶段会被确定
- 代码执行阶段:
- 由 js 引擎完成,主要执行可执行的代码,这个阶段执行上下文被创建(对象被创建)
- 执行上下文:
- 一个看不见的对象,存在若干个属性和变量,它被调用的时候创建的。函数被调用查看 this 指向 object,object 就是上下文(只有被调用的时候创建)
- 代码编译阶段:
作用域链
- 当代码在一个环境中执行时,会创建变量对象的一个作用域链
var name = "Tom" function say() { alert("hi," + name) } say() //hi, Tom1
2
3
4
5- 函数 say()的执行环境为全局环境,所以他的变量对象为 window。当函数执行到 name 时,先查找局部环境,找到则返回局部环境的 name,否则顺着作用域查找,在全局环境中找到 name 返回,这一查找变量的有序过程的依据就是作用域。
- 作用域链是保证执行环境有权访问的所有变量和函数的有序访问
- 当代码在一个环境中执行是,会创建变量对象的一个作用域链