函数声明如何影响提升?

How function declaration is affecting hoisting?

尽管没有调用内部函数,但下面的两个代码打印了不同的输出。

var a = 1;
function foo(){
  a= 2;
}
foo();
console.log(a);   // 2

但是如果我添加一个同名的函数,输出就不同了。虽然我不是在调用 a()

var a = 1;
function foo(){
  a= 2;
  function a(){
    a = 3;
  }
}
foo();
console.log(a);   // 1

不应该是2吗?为什么它记录 1?

因为在 foo 函数内直接声明了一个名为 a 的标识符,所以在 foo 函数内对名为 a 的变量赋值将引用该(本地)标识符,而不是任何可能的名为 a 的外部变量。就像:

var a = 1;
function foo(){
  // there an identifier named `a` initialized in this scope
  var a;
  // function declarations are hoisted
  a = function a(){
    a = 3;
  }
  // assignment to local identifier `a`
  a= 2;
}
foo();
console.log(a);   // 1