什么是提升?

看下代码,各输出结果是什么。

a = 2;
var a;
console.log(a);
console.log(a);
var a = 2;

第一段代码输出2;第二段输出undefined;来看看发生了什么?来看下编译器的处理形式:

var a;
a = 2;
console.log(a); //2
var a;
console.log(a); //undefined
var a = 2;

理解编译器过程的关键是“先声明,后赋值”,编译器会只将声明提升,赋值和其他操作被留在原地。再看下面的代码:

foo();
function foo(){
	console.log(a); //undefined
	var a = 2;
}

这个例子包括函数声明提升和作用域内的变量声明提升。

函数优先

来看下示例:

foo();
var foo; 
function foo(){
   console.log(1);
}
foo = function(){
   console.log(2);
}

输出结果为1而不是2!编译器的处理如下:

function foo(){
   console.log(1);
}
foo();
foo = function(){
   console.log(2);
}

函数foo被提升,虽然后面又变量var foo;编译器会认为是个重复声明被忽略,所以输出1。可见,函数提升优先级高于变量提升级别。