预编译
通篇检查语法错误
全局预编译
全局产生GO,global object,全局上下文
现象
foo(); // 这里正常运行function foo(){}console.log(a); // 这里也正常运行 undefinedvar a; // 或者 var a = 10;
声明提升
函数声明整体提升,变量只有声明提升,赋值不提升
var a = 1;function a(){}console.log(a);// 1. 找变量GO = {a: undefined}// 2. 找函数声明GO = {a: function a(){}}// 3. 执行
函数预编译
函数将要执行时会生成一个AO,active objcet,函数上下文。
function foo(a){console.log(a);var a = 1;console.log(a);function a(){}console.log(a);var b = function(){};console.log(b);function d(){}}// 1. 找到所有的变量声明(形参也是变量声明)AO = {a: undefined,b: undefined}// 2.绑定实参与形参绑定AO = {a: 2,b: undefined}// 3.找到函数声明覆盖AO = {a: function a(){},b: undefined}// 4. 执行函数
解释一行,执行一行
var b = 3;console.log(a);function a(a){console.log(a);var a = 2;console.log(a);function a(){}var b = 5;console.log(b);}a(1);
a = 1;function test(){console.log(a);a = 2;console.log(a);var a = 3;console.log(a);}test();var a;
function test(){console.log(b);if (a){var b = 2;}console.log(b);c = 3;console.log(c);}var a;test();a = 1;console.log(a);
function test(){return a;a = 1;function a(){}var a = 2;}test();
a = 1;function test(e){function e(){}arguments[0] = 2;console.log(e);if (a){var b = 3;}var c;a = 4;var a;console.log(b);f = 5;console.log(c);console.log(a);}var a;test(1);console.log(a);console.log(f);
暗示全局变量
imply global variable
// 全局下a = 1; // 这样的操作等于是window.a = 1;// 全局下声明的变量自动挂载到window下var a = 1;
// 函数下function foo(){var a = b = 1; // b将会被挂载到window下}
