**
全局预编译和局部预编译
**
1.全局预编译
第一步创建GO对象(global Object)。
第二步找变量声明,将变量声明作为GO对象的属性值传进去,赋值为undefined。
第三部找函数声明(不要找函数表达式),赋值于对应的GO属性值。
例子:
console.log(a);
var a ;
a = 10;
console.log(a)
function a (){}
var a = function (){}
console.log(a)
解释:
1.创建GO对象。
2.找到变量声明,赋值undefined。
GO{
a:undefined;
}
3.找到函数声明,赋值对应的GO对象。
GO{
a:function a(){};
}
4.开始执行代码。
GO{
a:undefined;—> function a(){};—> 10; —>function( ){ }
}
第一个打印的a,经过预编译现在a等于 function a( ){ }
第三行,a=10, 现在GO对象的a=10。
第二个打印的a,经过改变打印出 10。
第六行,a = function( ){ },现在GO对象的a=function( ){ }。
第三个打印的a,经过改变变成 function( ){ }
2.函数预编译
1.创建AO对象
2.找函数的形参和变量声明,将变量声明和形参作为AO属性名,值为undefined,
3.将实参值和形参统一
4.在函数体里面找函数声明(只找函数声明,不找函数表达式),值赋予函数体
例子:
```javascript
function a(x){
console.log(x);
var x = 123;
console.log(x);
function x(){}
console.log(x);
var b = function(){}
console.log(b)
}
a(1)
解释:
1.创建AO对象。
2.找函数的形参和变量声明,并赋值undefined。
AO{
x:undefined;
b:undefined;
}
3.形参和实参相统一。
AO{
x:undefined;—> 1;
b:undefined;
}
4.找函数声明,并赋值对应的AO对象.
AO{
x:undefined;—> 1; —> function x(){};
b:undefined;
}
5.开始执行代码
AO{
x:undefined;—> 1; —> function x(){}; —> 123
b:undefined; —> function(){ };
}
第一个打印的x , 打印出来 function x(){};。
第三行x = 123 。现在AO对象的 x = 123。
第二个打印的x , 打印出来 123 。
第五行因为已经预编译提升了,就不管他了。
第三个打印的x , 打印出来123。
第七行 b = function(){},现在AO对象的 b = function(){}。
第四个打印的b,打印出来 function(){ }。
附加一个题:
a=100;
function demo(e){
function e(){};
arguments[0]=2;
console.log(e); //2
if(a){
var b = 123;
function c() { }
}
var c;
a = 10;
var a ;
console.log(b);//undefined
f = 123;
console.log(c)//undefined
console.log(a)//10
}
var a ;
demo(1);
console.log(a);//100
console.log(f);//123
创建GO对象
GO{
a:undefined;-->100;
demo:function demo(){};
f:123;
}
创建AO{
e:undefined;-->1;-->function e(){};-->2;
b:undefined;
c:undefined;
a:undefined;-->10;
}
if判断中并不能写函数,所以并不会来进行提升。