我们知道,对于所有的变量,无论在函数体的什么地方声明,都会在后台被提升到函数体顶部。

这个规则对于函数同样适用,其原因在于函数只是分配给变量的对象。唯一需要引起注意的地方在于当适用函数声明时,函数定义也会被提升,而不仅仅是函数声明被提升。看下面的代码:

function test() {
  console.log(typeof foo);   // "function"
  console.log(typeof bar);   // "undefined"

  function foo() {

  }

  var bar = function () {

  };
}

test();

test()函数中的foobar的声明被提升到了顶部;同时,需要注意的是:foobar的区别在于前者的定义得到了提升,而后者的定义没有提升,这也就是console.log(typeof bar)输出undefined的原因。

所以,需要记住的是:函数表达式仅仅是变量被提升,而函数的实现没有被提升。
上面的代码中,后台解析的代码类似于:

function test() {
  var bar;
  function foo() {

  }
  console.log(typeof foo);   // "function"
  console.log(typeof bar);   // "undefined"

  var bar = function () {

  };
}

test();

MockingBird
5.8k 声望743 粉丝