1. JS 的运行
JS 的运行分为 3 步
(1) 语法分析
(2) 预编译
(3) 解释执行
预编译
-
在预编译的时候:
(1) 函数声明整体提升
(2) 变量声明提升 -
注意的细节
(1) imply global 暗示全局变量: 即任何变量, 如果变量未经声明就进行赋值, 此变量就归全局所有
(2) 一切声明的全局变量, 都是 window 属性 -
预编译的过程:
(1) 创建 AO 对象, 即局部变量表 ( 全局则生成 GO 对象, 即全局变量表 )
(2) 找形参和变量声明, 将变量和形参名作为 AO 对象的属性名, 值为 undefined
(3) 将实参值和形参统一
(4) 在函数体里面找函数声明, 值赋予函数体
2. 作用域
- [[scope]] 指的是作用域, 其中存储了运行上下文的集合, 而且该属性是隐式属性, 不可被调用
- 运行期上下文:
当函数执行时, 会创建一个成为执行期上下文的对象.
一个执行期上下文定义了一个函数执行期时的环境,
函数每次执行都会创建一个执行期上下文, 执行完毕之后销毁,
AO 和 GO 就是执行期上下文.
- 查找变量:
a 在定义出来后在作用域链中存入 GO
a 在执行时会在作用域链首位放入 AO
变量现在 AO 中寻找, 找不到该变量后才回去 GO 中寻找
即, 函数内部的局部变量比函数外的全局同名变量在函数体中调用时优先级更高