编译
函数预编译
- 创建 AO 对象
- 找变量声明 形参,将变量名 形参名 当作 AO 对象的属性名,值为undefined
- 将实参和形参统一
- 在函数体内找函数声明,赋值予函数体
function fn(a,c){ console.log(a); // ƒ a(){} var a = 111; console.log(a); // 111 console.log(c); // ƒ c(){} function a(){}; if(false){ var d = 222; }; console.log(d); // undefined console.log(b); // undefined var b = function(){}; console.log(b); // ƒ (){} function c(){}; console.log(c) // ƒ c(){} }; fn(20,30)
全局预编译
- 创建 GO 对象
- 找变量声明,将变量名当作 GO 对象的属性名,值为undefined
- 找函数声明 赋值予函数体
console.log(test); // f test(){} console.log(b); // undefined function test(a){ console.log(c); // undefined var a = b = 365; c = 9; if(false){ var c = 1000 }; console.log(a) // 365 console.log(c) // 9 }; test(100); console.log(b); // 365 ? 注意连续赋值时 console.log(test) // f test(){} var test = 500; var b = 800;