# 函数提升

在你的代码被执行之前,所有的声明、变量和函数都会被处理。

# 变量提升

console.log(a);

var a = 2;

声明语句是在编译的时候被处理的。赋值确实留在了原地。

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

这才是最终运行的代码。

变量和函数声明被从它们在代码流中出现的位置“移动”到代码的顶端, 就产生了提升一概念。

# 函数提升

foo();
function foo() {}

最终执行的代码长这样

function foo() {}
foo();

# 函数优先

函数声明和变量声明都会被提升, 那么谁先谁后呢?

foo();
var foo;
function foo() {};

foo = function () {};

即便 var foo; 被声明在后面,但是函数提升的优先级要高,所以 var foo;会被无视。

注意:变量重复声明会被无视,但是函数声明是会被后面的覆盖的。