GO{ x: undefined y: undefined z: undefined add: function add (n) { return n = n + 1; } => function add (n) { return n = n + 3; } }
按顺序执行代码
1 2 3 4 5 6 7 8 9 10 11 12 13
var x = 1, y = z = 0;
functionadd (n) { return n = n + 1; } //预编译环节已经进行了变量提升,故执行时不在看这行代码
y = add(x); functionadd (n) { return n = n + 3; }//预编译环节已经进行了变量提升,故执行时不在看这行代码,但是这一函数覆盖了前面的add函数
z = add(x)
1 2 3 4 5 6 7
故而我们的GO对象变成了 GO{ x: 1 y: 0 z: 0 add: function add (n) { return n = n + 3; } }
所以我们可以知道,此时x的值为1,y的值为4,z的值为4.
函数预编译
创建AO对象,执行期上下文。
寻找函数的形参和变量声明,将变量和形参名作为AO对象的属性名,值设定为undefined.
将形参和实参相统一,即更改形参后的undefined为具体的形参值。
寻找函数中的函数声明,将函数名作为AO属性名,值为函数体。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
functionfn(a){ console.log(a); var a = 123; console.log(a); functiona(){}; console.log(a); var b = function(){}; console.log(b); functiond(){}; } //调用函数 fn(1);
functionfn(a){ console.log(a);// 输出functiona(){} var a = 123; console.log(a);// 输出123 functiona(){};//预编译环节已经进行了变量提升,故执行时不在看这行代码 console.log(a);// 输出123 var b = function(){};//这个是函数表达式不是函数声明,故不能提升,会对AO中的b重新赋值 console.log(b);//输出function(){} functiond(){}; }
综合案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var a = 1; console.log(a); functiontest(a) { console.log(a); var a = 123; console.log(a); functiona() {} console.log(a); var b = function() {} console.log(b); functiond() {} } var c = function (){ console.log("I at C function"); } console.log(c); test(2);
全局预编译
1 2 3 4 5 6 7 8 9 10 11 12 13 14
GO{ a: undefined, c: undefined, test: function(a) { console.log(a); var a = 123; console.log(a); function a() {} console.log(a); var b = function() {} console.log(b); function d() {} } }
按顺序执行代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
GO{ a: 1, c: function (){ console.log("I at C function"); }, test: function(a) { console.log(a); var a = 123; console.log(a); function a() {} console.log(a); var b = function() {} console.log(b); function d() {} } }
var a = 1; console.log(a); // 1 functiontest(a) { console.log(a); // function a() {} var a = 123; console.log(a); // 123 functiona() {} console.log(a); // 123 var b = function() {} console.log(b); // function b() {} functiond() {} } var c = function (){ console.log("I at C function"); } console.log(c); // function c(){ console.log("I at C function"); } test(2);