javaScript的预编译问题总结

预编译过程发生在函数执行前一刻。 因为预编译过程,因而产生的变量声明提升,和 函数声明整体提升

  1. 函数内部预编译
  • 创建AO对象;
  • 将函数的形参和变量声明作为AO对象的属性名,并且值为undefined;
  • 将函数的实参值和形参值统一;
  • 在函数中找函数声明,将对应函数体作为它的值; 

     2. 全局预编译

  • 创建GO对象;
  •  在函数中找函数声明,将对应函数体作为它的值;

实例:

	function fn(a){
		console.log(a);   //function
		var a=123;
		console.log(a);   //123
		function a(){};
		console.log(a);    //123
		var b=function(){};
		console.log(b);    //function
		function d(){}; 
	}	
  	AO{
		a:undefined/function a(){}/1/123/
		d:undefined/function d(){}
  	}
	fn(1);
function test(a,b){
		console.log(a);   // 1
		c=0;
		var c;			//undefined 
		console.log(c)  //0
		a=3;
		b=2;
		console.log(b);		//2
		function b(){};
		function d(){};
		console.log(b);			//2  
		console.log(d);       //function d(){}
	}
	AO{
		a:undefined/1/3
		b:undefined/function b(){}/2
		c:undefined/0
		d:undefined/function d(){}
	}
	test(1);
GO{
		a:undefined/10,
		c:undefined/234,
	}

	function test(){
		console.log(b);  //undefined
		if(a){  //undefined
			var b=100;
		}
		console.log(b);  //undefined
		c=234;
		console.log(c);		//234
	}

	var a;
	AO{
		b:undefined
	}
	test();
	a=10;
	console.log(c);     //234
    function bar(){
		return foo;
		foo=10;
		function foo(){};
		var foo=11;
	}
	AO{
		foo:undefined/function foo(){}/11
	}
	console.log(bar());   //function foo(){}
	console.log(bar());
	AO{
		foo:undefined/function foo(){}/10/11
	}
	function bar(){
		foo=10;
		function foo(){};
		var foo=11;
		return foo;          //11
	}
     a=100;
	 function demo(e){
		function e(){}; 
		arguments[0]=2;
		console.log(e);  //2
		if(a){
			var b=123;
			// function c(){
			// 	// chrome内核暂时已经不再支持
			// }
		}
		var c;
		a=10;
		var a;
		console.log(b);  //undefined
		f=123;
		console.log(c); //undefined function
		console.log(a);  //10
	} 
	var a;
	demo(1);
	console.log(a);		//100
	console.log(f);		//123

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值