js运行三部曲
语法分析(通篇扫描的过程)
预编译
解释执行
引例
function test(){
console.log('a');
}
test();//a
在这个例子中,由于JavaScript是解释性语言,因此会解释一句执行一句。最终的结果为a.
test();
function test(){
console.log('a');
}
如果是这种情况,将test()放在函数前面,结果依然能执行并且为a,这就是预编译的产生的效果.
在看一个例子
console.log(a);
var a = 123;
预编译前奏
函数声明整体提升:不管函数声明在任何位置,系统总会将它放在逻辑的最前面。
变量 声明提升:变量声明也会被系统放在最前面。
- imply global暗示全局变量:任何变量,如果变量未经声明就赋值,此变量就为全局对象(window)所有
eg: a = 123;
eg: var a = b =123; - 一切声明的全局变量,全都是window的属性
eg: var a = 123;====>window.a = 123;
预编译四部曲
- 创建AO对象
- 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
- 将实参值和形参统一
- 在函数体里面找函数声明,值赋予函数体
例题:
function fn(a){
console.log(a);
var a = 123;
function a(){}
console.log(a);
var b = function(){}
console.log(b);
function d(){}
}
fn(1);
解决方式:预编译发生在函数执行的前一刻
//根据四部曲得到的结果如下:
AO{
a : function a(){},
b : undefined,
d : function d(){},
}
//根据函数执行结果如下:
AO{
a : 123,
b : function(){},
d : function d(){},
}
预编译还发生在全局
- 生成GO对象(Global Object)====>window对象
- 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
- 将实参值和形参统一
- 在全局种寻找函数声明,值赋予函数体
GO对象比AO对象先产生
关注博主,每天分享一个小技巧!!!