js全局预编译和局部预编译

**

全局预编译和局部预编译

**
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判断中并不能写函数,所以并不会来进行提升。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值