[JavaScript,ES6]函数声明提升和预解析的总结和试验

1. 变量的声明被提前到作用域顶部,赋值保留在原地
2. 函数声明整个“被提前” (且后面不再重新“赋值”)
3. 函数表达式时,只有变量“被提前”了,函数没有“被提前”

4. 在块中定义的函数声明或函数表达式: 

    ES6:会把函数声明当作带var的函数表达式,把函数变量提升到全局作用域或函数作用域的头部;也会把整个函                 数声明提升到本块级的头部。
   ES5:会把整个函数声明提升到全局作用域或函数作用域的头部。
   //不要在块中声明函数。 

5.如果在提升的时候发生重命名了怎么办?  
首先还是都会提升(函数声明整个“被提前”,且后面不再重新“赋值”),但是编译器在遇到变量声明时,如果发现已经有同名的声明了,就忽略执行这一条声明。
6.全局作用域下,不带var声明变量,相当于window对象的属性值名,不会提升,带var则是全局变量,会提升。
7.不管条件是否成立,都要把带var的进行提前的声明.——if(false){//带var的变量}
8.立即执行函数定义的function在全局作用域下不进行预解析,当代码执行到这个位置的时候,定义和执行一起完成了。

9.函数体内return之后的代码,该预解析的依然会进行预解析。


—— ES6没有变量提升


请看以下代码的:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>变量提升发生重名的情况</title>
<style type="text/css">
   
</style>
</head>
<body>

<script>
	(function () {
		var a = 12;
		console.log(a);         //12
		function a() {};
		console.log(a);         //12
		a = 'aaa';
		console.log(a);			//'aaa'	
	})()
	//相当于
		(function () {
			//变量提升
			var a;
			function a() {};  //编译时忽略
			var a;            //编译时忽略
			//变量赋值
			a = 12;
			//执行
			console.log(a);   //12 
			console.log(a);   //12
			//变量赋值
			a = 'aaa';
			//执行
			console.log(a);	  //'aaa'			
	})()

	(function () {
		var fn = 13;                                       
		var fn =  function () {                                    
		    console.log('ok');                               
		}                                                  
		fn();    //ok
	})()
	//相当于
	(function () {
		//变量提升
		var fn;
		var fn;   //编译时忽略
		//变量赋值,函数表达式只提升了声明部分,还会再赋值
		fn = 13;
		fn =  function () {                                    
		    console.log('ok');                               
		}
		//执行
		fn();    // ok             
	})()

	(function () {
		var fn = 13;                                       
		function fn() {                                    
		    console.log('ok');                               
		}                                                  
		fn();    //fn in not a function
	})()
	//相当于
	(function () {
		//变量提升
		var fn;
		fn =  function () {                                    
		    console.log('ok');                               
		}              //编译时忽略
		//变量赋值,函数声明已全部提升,不再赋值        
		fn = 13;
		fn();    //fn in not a function            
	})()



</script>
</body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值