JS预编译解决变量提升
JS执行三部曲
语法分析
预编译
- 函数声明整体提升、变量声明提升(预编译造成的现象)
预编译前奏
imply global暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有
a = 123 // * 此时a归window所有
var a = b = 123
function test() {
var c = d = 123 // *此时d归window所有
}
- 一切声明的全局变量,全是
window的属性
var a = 213; ==> window.a = 123;
预编译发生在函数执行的前一刻
四部曲
例子:
function fn(a) {
console.log(a)
var a = 123
console.log(a)
function a() {}
console.log(a)
var b = function() {}
console.log(b)
function d() {}
}
fn(1)
- 创建AO对象()(执行期上下文)
- 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
AO {
a:undefined // * var a = 123
b:undefined // * var b = function() {}
}
- 将实参值和形参统一
AO {
a: 1 // * fn(1)
b: undefined
}
- 在函数体里面找函数声明,值赋予结构体
AO {
a: function a(){}
b: undefined
d: function d(){}
}
解析
function fn(a) {
console.log(a)
// * 在AO中找到a 打印function a(){}
var a = 123
// 执行 a = 123 AO.a = 123
// var声明(变量提升现象)在AO过程实现
console.log(a)
// 打印 123
function a() {} // 预编译已经做过了
console.log(a) // 打印123
var b = function() {} // AO.b = function(){}
console.log(b) // function(){}
function d() {} // 预编译做过了
}
fn(1)
全局预编译除无传参外其他一致(GO(Global Object === window))