对于 var a = 2; 我们习惯将其看作一个声明,而实际上 JavaScript 引擎将 var a 和 a = 2 当作两个单独的声明,第一个是编译阶段的任务,而第二个则是执行阶段的任务。
这意味着无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先处理。可以将这个过程形象的想像成所有的声明(变量和函数)都会被“移动”到各自的作用域的最顶端,这个过程叫提升。
函数优先
函数声明和变量声明都会被提升,但是如果有重复声明的代码中,函数的会首先被提升,然后才是变量。
foo(); // 1
var foo;
function foo() {
console.log(1);
}
foo = function () {
console.log(2);
}