JS--JS运行三部曲
语法分析(通篇扫描一遍但不执行)
预编译
function test(){
console.log(a);
}
test();
//上下两块代码都能执行并在控制台输出结果a
test();
function test(){
console.log(a);
}
console.log(a);
var a = 123; //控制台输出undefined
如果只有 console.log(a); 则会报错,a is not defined
---------------------------------------------
var a = 123;
console.log(a); //控制台输出123
函数声明整体提升:函数不管写在那一部分,系统总是会把函数提到逻辑的最前面
变量 声明提升:var a = 123;---->var a; a = 123; 系统会将var a;这一部分提到程序的最前面
//会输出什么?
console.log(a); //输出function a(a) {......}
function a(a){
console.log(a); //输出function a() {}
var a = 234;
console.log(a); //输出234
function a() {}
}
a(1);
var a = 123;
预编译前奏
- imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量 就为全局对象(window)所有
eg: a = 123;
eg: var a = b = 123; ----> b = 123; -> var a; -> a = b; - 一切声明的全局变量,全是window的属性;window就是全局的域
eg: var a = 123; ---->window.a = 123;
预编译四步曲
1、创建AO对象(Activation Object)(执行期上下文:函数产生的存储空间库)
2、找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3、将实参值和形参统一
4、在函数体里面找函数声明,值赋予函数体
//不同地方的 console.log(a); 输出结果是什么?
function fn(a){
console.log(a); //在AO里找值--->输出 function a() {}
var a = 123; //预编译将 var a;提升上去了,执行 a = 123;修改AO中a的值
console.log(a); //输出 123
function a() {} //预编译读过,不再读
console.log(a); //输出 123
var b = function() {} //函数表达式,将AO中b的值改为function () {}
console.log(b); //输出funtion () {}
function d() {}
}
fn(1);
预编译发生在函数执行的前一刻;预编译也发生在全局,第一步为创建GO对象;
GO(Global Object) === window
第一步:AO{ }
第二步:
AO{
a : undefined,
b : undefined
}
第三步:
AO{
a : 1,
b : undefined
}
第四步:
AO{
a : function a() {},
b : undefined,
d : function d() {}
}