JavaScript 变量提升


总结

  • 只有声明本身会被提升,而赋值或其他运行逻辑会被留在原处。
  • 函数声明会被提升,函数表达式不会被提升。
  • 函数声明首先被提升,然后才是变量。

输出 2

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

输出 undefined

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

输出 2

foo();

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

抛出 TypeError 异常:

foo();

var foo = function () {
  //...
}

输出 1

foo();

var foo;

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

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

尽管 var foofunction foo() 之前,但是函数声明会被提升到普通变量之前,最终代码被引擎理解为:

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

var foo;

foo();

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

如果后面再次调用 foo(),函数声明就会被函数表达式 foo 覆盖。