我们先看两个相似的代码
a = 2;
var a ;
console.log(a);
console.log(a);
var a = 2;
第一个输出的是2
第二个输出值为underfined
大家可能为会好奇这是为什么呢?
下面我们来研究一下
这是因为变量和函数在内的所有声明都会在任何代码被执行前首先被处理
所以第一个代码实际上是这样处理的
var a;
a = 2;
console.log(a);
第二个代码是这样处理的
var a ;
console.log(a);
a = 2;
这个过程就好像变量和函数声明从它们在代码中出现的位置被“移动”到了最上面。这个过程就叫做提升
注意:只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。如果提升改变了代码执行的顺序,会造成非常严重的破坏。函数声明可以提升,函数表达式不可以提升,
函数优先
函数声明和变量声明都会被提升,但是在重复声明的代码中函数会首先被提升,然后才是变量
foo();//1
var foo;
function foo() {
console.log(1);
}
foo = function() {
console.log(2);
}
这个会输出1而不是2,这段代码会被引擎理解成下面格式
function foo(){
console.log(1);
}
foo(); // 1
foo = function(){
console.log(2);
}
这里var foo尽管出现在function foo()......的声明之前,但是因为它是重复的声明(因此被忽略了)因为当有重复声明时,函数声明会优先于变量声明被提升。