Hoisting

  • 14.1 var 声明会被提升至该作用域的顶部,但它们赋值不会提升。letconst 被赋予了一种称为「暂时性死区(Temporal Dead Zones, TDZ)」的概念。这对于了解为什么 type of 不再安全相当重要。

    1. // 我们知道这样运行不了
    2. // (假设 notDefined 不是全局变量)
    3. function example() {
    4. console.log(notDefined); // => throws a ReferenceError
    5. }
    6. // 由于变量提升的原因,
    7. // 在引用变量后再声明变量是可以运行的。
    8. // 注:变量的赋值 `true` 不会被提升。
    9. function example() {
    10. console.log(declaredButNotAssigned); // => undefined
    11. var declaredButNotAssigned = true;
    12. }
    13. // 编译器会把函数声明提升到作用域的顶层,
    14. // 这意味着我们的例子可以改写成这样:
    15. function example() {
    16. let declaredButNotAssigned;
    17. console.log(declaredButNotAssigned); // => undefined
    18. declaredButNotAssigned = true;
    19. }
    20. // 使用 const 和 let
    21. function example() {
    22. console.log(declaredButNotAssigned); // => throws a ReferenceError
    23. console.log(typeof declaredButNotAssigned); // => throws a ReferenceError
    24. const declaredButNotAssigned = true;
    25. }
  • 14.2 匿名函数表达式的变量名会被提升,但函数内容并不会。

    1. function example() {
    2. console.log(anonymous); // => undefined
    3. anonymous(); // => TypeError anonymous is not a function
    4. var anonymous = function() {
    5. console.log('anonymous function expression');
    6. };
    7. }
  • 14.3 命名的函数表达式的变量名会被提升,但函数名和函数函数内容并不会。

    1. function example() {
    2. console.log(named); // => undefined
    3. named(); // => TypeError named is not a function
    4. superPower(); // => ReferenceError superPower is not defined
    5. var named = function superPower() {
    6. console.log('Flying');
    7. };
    8. }
    9. // the same is true when the function name
    10. // is the same as the variable name.
    11. function example() {
    12. console.log(named); // => undefined
    13. named(); // => TypeError named is not a function
    14. var named = function named() {
    15. console.log('named');
    16. }
    17. }
  • 14.4 函数声明的名称和函数体都会被提升。

    1. function example() {
    2. superPower(); // => Flying
    3. function superPower() {
    4. console.log('Flying');
    5. }
    6. }
  • 想了解更多信息,参考 Ben CherryJavaScript Scoping & Hoisting