# 函数提升
在你的代码被执行之前,所有的声明、变量和函数都会被处理。
# 变量提升
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;会被无视。
注意:变量重复声明会被无视,但是函数声明是会被后面的覆盖的。
← 词法作用域和动态作用域 作用域链 →