JavaScript执行三步骤1.1 语法分析通篇扫描 检测低级语法错误
1.2 预编译1.2.1 什么是预编译?将声明式函数和变量 提升到当前作用域的最顶端
声明式变量只提升 声明变量 不提升赋值
声明式函数是将整个函数提升
1.2.2 全局预解析和局部预解析 “四步”1.2.2.1 全局预解析- 创建GO对象 (Global Object => 全局对象) GO => window
- 找变量声明 将变量作为GO对象的属性名 值为undefined
- 将变量值统一
- 在函数体里面找函数声明 值赋予函数体 找声明的函数作为GO的属性名 再将对应的函数体统一
1.2.2.2 局部预解析(函数)- 创建AO对象(activation Object => 活跃对象) 执行期上下文(作用域)
- 找形参和变量声明 将变量和形参名作为AO属性名 值为undefined
- 将实参值和形参统一(赋值)
- 在函数体里面找函数声明 值赋予函数体 找声明的函数作为AO的属性名 再将对应的函数体统一
1.2.3 注意函数提升的优先级比变量提升的要高
而且不会被变量声明覆盖
但会被变量赋值覆盖!!!
1.2.4 测试题目console.log(a) // fnvar a = 123;function a() {}console.log(a) //123预编译后 |
|