变量预编译
- 任何变量,如果未经声明就赋值,此变量是属于 window 的属性,而且不会做变量提升,无论在哪个作用域内赋值。比如说直接写 console.log(a)肯定会报错,提示找不到 a。但如果直接写 a = 100就不会报错,此时这个 a 就是 window.a。
- 一切声明的全局变量(即在全局作用域内声明的var),全是window的属性。
函数预编译步骤
- 创建AO对象。AO即 Activation Object 活跃对象,其实就是「执行期上下文」。
- 找形参和变量声明,将形参名和变量作为 AO 的属性名,值为undefined。
- 将实参值和形参统一,实参的值赋给形参。
- 查找函数声明,函数名作为 AO 对象的属性名,值为整个函数体。