javascript 解析顺序

ES5 解析顺序

ES6没有这样的解析顺序
  1. 定义阶段

​ 先找到当前作用域(不会找子作用域)的 var 和 function 关键词

​ var 先把变量定义出来,但是不会赋值(赋值属于执行阶段)

​ function 先把函数定义出来

  1. 执行阶段

​ 从上到下执行

例一

*	1. 定义
*		var a;
*		functon b(){}
*	2. 执行
*		b();
*		a = 10;
*/

b();
var a = 10;
function b(){
    alert(1);
}
//var b = function(){}不属于function定义的,属于var定义的

例二

var x = 10; 
a();
console.log(x);
function a(){    
    var x = 20;    
    console.log(x);
} 


/*
	全局作用域
	1.定义
		var x;
		function a(){...}
	2.执行
		x = 10;
		a();	====>   局部作用域
						1.定义
							var x;
						2.执行
							x = 20;
							console.log(x); //20
		console.log(x);//10
*/

例三
a();
function a(){
    console.log(1);
}
function a(){
    console.log(2);
}

/*
	1.定义
		function a(){} //第一个a 被覆盖
		function a(){} //第二个a
	2.执行
		a();//2
*/
例四
var a = 10;
function a(){
    console.log(10);
}
console.log( a );//f a(){}
console.log( a() );//10

//只要有var 和 function 同名,以function为准
案例
var x = 5; 
a(); 
function a(){    
    alert(x);    
    var x = 10; 
}
alert(x)

//undefined 5
/*
	1.定义
		var x;
		function a(){...}
	2.执行
		x = 5;
		a();	===>	局部作用域
						1.定义
							var x;
						2执行
							alert(x);  //undefined
							x = 10;
		alert(x);	//5
*/
a();
function a(){    
    alert(x);   
    var x = 10; 
} 
alert(x);

//undefined 报错
/*
	1.定义
		function a(){...}
	2.执行
		a();	===>	局部作用域
						1.定义
							var x;
						2执行
							alert(x);  //undefined
							x = 10;
		alert(x);	//报错
*/
function a(){    
    alert(1); 
} 
var a; 
alert(a);

//f a(){}
alert(a); 	//function a(){alert(40)}
var a = 10; 
alert(a); 	//10
function a(){//在定义阶段定义,执行阶段不调用则不进入
    alert(20)
} 
alert(a);	//10
var a = 30; 
alert(a); 	//30
function a(){
    alert(40)
} 
alert(a);	//30

/*
	1.定义
		var a;				//被覆盖
		function a(){..20}	//被覆盖
		var a;				//被覆盖
		function a(){..40}
	2.执行
		alert(a);	//function a(){alert(40)} 函数块
		a = 10;
		alert(a); 	//10
		alert(a); 	//10
		a = 30;
		alert(a); 	//30
		alert(a); 	//30
*/
var a = 10; 
alert(a); 
a();
alert(a); //报错后后面的同步代码不执行了
function a(){    
    alert(20); 
}
//10 报错
/*
	1.定义
		var a;				//被覆盖
		function a(){..20}
	2.执行
		a = 10;
		alert(a);	//10
		a();		//报错  a现在是number(a is not a function)
*/
a(); 
var a = function(){
    alert(1)
}; 
a(); 
function a(){
    alert(2)
}; 
a(); 
var a = function(){
    alert(3)
};
a();

//2 1 1 3
/*
	1.定义
		var a;				//被覆盖
		function a(){..2}
		var a;				//有function以function为准
	2.执行
		a();	//2
		a = function a(){..1}
		a();	//1
		function a(){..2}//定义阶段,执行阶段跳过
		a();	//1
		a = function a(){..3}
		a();	//3
*/
var a = 10; 
function fn(){   
    alert(a);   
    var a = 1;   
    alert(a); 
} 
fn(); 
alert(a);
//undefined 1 10
/*
	1.定义
		var a;
		functon fn(){}
	2.执行
		a = 10;
		fn();	===>	局部作用域
						1.定义
							var a
						2.执行
							alert(a);	//undefined 1 10
							a = 1;
							alert(a);	//1
		alert(a);	//10
*/			
fn(); 
alert(a); 
var a = 10; 
alert(a); 
function fn(){    
    var a = 1;
}
//undefined 10
/*
	1.定义
		var a;
		functon fn(){}
	2.执行
		fn();	===>	局部作用域
						1.定义
							var a
						2.执行
							a = 1;
		alert(a); 	//undefined
		a = 10;
		alert(a);	//10
*/	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值