JS预编译
函数的预编译总是发生在函数执行的前一刻
- 一切声明的全局变量都是window的属性;
eg
var num = 1;
console.log(window.num); // --> 1;
- imply global 暗示全局变量 : 任何一个变量未经声明就赋值,此变量为全局对象所有 ——> 即为window的属性;
eg:
function test() {
var a = b = 1;
console.log(a, b);
}
test(); // --> 1 1;
console.log(b); //--> 1;未经声明就赋值,就成为全局变量 打印 1
console.log(a); //--> 报错; a是全局没有,只在test内,作用域问题,下节将;
- 创建一个AO对象 --> AO:执行期上下文 Activation Object
- 找形参和变量声明,将变量名和形参名作为AO的属性名,并赋值为undefined;(若名称相同则写一个并赋值undefined);
- 将形参和实参统一(将实参值赋给AO中与形参相同的属性);
- 找函数声明,赋值为函数体(若函数名与上面某个变量相等时,则用函数体覆盖);
eg
function test(a, b){
var b = 10;
function a(){
console.log(a);
}
console.log(a, b);
}
test(1, 2);
/* 预编译过程
1. 创建一个AO对象 ==> AO = {};
2. 找形参和变量声明 ==> AO = {
a : undefined,
b : undefined
}
3. 将形参和实参统一 ==> AO = {
a : 1,
b : 2
}
4. 找函数声明,赋值为函数体 ==> AO = {
a : function a(){
console.log(a);
},
b : 2
}
*/
//当预编译执行完:AO为第四步的AO 此时执行函数内部语句:b = 10; ==> AO{
// a : function a(){
// console.log(a);
// },
// b : 10
// }
//a的函数声明在预编译时执行过了 不看
//执行console.log(a, b) ==> function(){} 10
ps:js函数执行时查找变量的值都在自己的AO(Activation Object)中找如果没有会去GO(Global Object 下面讲)中找.
- 创建一个GO对象 --> Global Object
- 找变量声明作为AO的属性名,并赋值为undefined;(若名称相同则写一个并赋值undefined);
- 找函数声明,赋值为函数体(若函数名与上面某个变量相等时,则用函数体覆盖);
ps : GO === window
AO GO关系:AO里没有去GO找,
GO没有那就没有了;