Javascript吊装混乱

Javascript hoisting confusion

我读了 Kyle 的 I don't know JS 并了解到函数声明将 hoistvar 之前。所以在下面的代码中

<script>
   foo();
   var a = true;
   if ( a  ) {
          function foo() { console.log( "a"  );  }
   }else {
          function foo() { console.log( "b"  );  }
   }

   foo();
</script>

foo 应该首先被提升并且应该打印 "b" 作为第一个 foo() 的输出,对吗?还是我遗漏了什么?

解释或 link 理解代码并在不同场景中提升将有很大帮助。

提升(以您在这里期望的方式)只有在存在明确的先例顺序时才会起作用。在这种情况下,因为您的函数是在 if 块中定义的,所以不会像您期望的那样提升它。

这将起作用:

  foo();
   var a = true;
   function foo() { console.log( "a"  );  }

   foo();

因为它从等式中删除了您的 if 语句。