js执行上下文变量提升问题

// js 变量提升问题 ,es6 则不存在这种问题了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
fn = !(function(){
	
	console.log(arguments);  //得到默认参数
	
	
	console.log('a:'+a);  // 1. 打印的是 默认函数申明表达方式 function  a
	
	var  a = '变量  a';  //声明变量a
	
	function a(){
		//申明方式放在后面 却通过 hoist 机制提前了 从而导致 第一个console.log 打印出来值
		return '------------默认函数申明方式  申明a---------------';
	}
	
	console.log('a:'+a);  // 这里的a是变量 var a
	
	var a = function(){
		// 申明其实提前了 ,最后执行的时候将函数赋值给变量
		return '------------函数表达式方式       申明a---------------';
	}
	
	console.log('a:'+a);
	
	
	//console.log(this);  //得到this对象
	
	return a ;
})('arg1','arg2','arg3');

//正常的js执行上下文 (建立阶段((变量,函数,arguments对象,参数)(建立作用域链)(确定this的值))执行阶段(变量赋值,函数引用,执行其它代码)) //所以使用默认的申明函数方式 可能会打破js执行上下文的方式,所以千万注意不能使用function fn(){} 这种方式定义函数