14. 提升

2018-02-24 16:11 更新
  • 14.1?var?聲明會(huì)被提升至該作用域的頂部,但它們賦值不會(huì)提升。let?和?const?被賦予了一種稱為「暫時(shí)性死區(qū)(Temporal Dead Zones, TDZ)」的概念。這對(duì)于了解為什么?type of 不再安全相當(dāng)重要。

    // 我們知道這樣運(yùn)行不了 
    // (假設(shè) notDefined 不是全局變量)
    function example() {
      console.log(notDefined); // => throws a ReferenceError
    }
    
    // 由于變量提升的原因,
    // 在引用變量后再聲明變量是可以運(yùn)行的。
    // 注:變量的賦值 `true` 不會(huì)被提升。
    function example() {
      console.log(declaredButNotAssigned); // => undefined
      var declaredButNotAssigned = true;
    }
    
    // 編譯器會(huì)把函數(shù)聲明提升到作用域的頂層,
    // 這意味著我們的例子可以改寫(xiě)成這樣:
    function example() {
      let declaredButNotAssigned;
      console.log(declaredButNotAssigned); // => undefined
      declaredButNotAssigned = true;
    }
    
    // 使用 const 和 let
    function example() {
      console.log(declaredButNotAssigned); // => throws a ReferenceError
      console.log(typeof declaredButNotAssigned); // => throws a ReferenceError
      const declaredButNotAssigned = true;
    }
  • 14.2?匿名函數(shù)表達(dá)式的變量名會(huì)被提升,但函數(shù)內(nèi)容并不會(huì)。

    function example() {
      console.log(anonymous); // => undefined
    
      anonymous(); // => TypeError anonymous is not a function
    
      var anonymous = function() {
        console.log('anonymous function expression');
      };
    }
  • 14.3?命名的函數(shù)表達(dá)式的變量名會(huì)被提升,但函數(shù)名和函數(shù)函數(shù)內(nèi)容并不會(huì)。

    function example() {
      console.log(named); // => undefined
    
      named(); // => TypeError named is not a function
    
      superPower(); // => ReferenceError superPower is not defined
    
      var named = function superPower() {
        console.log('Flying');
      };
    }
    
    // the same is true when the function name
    // is the same as the variable name.
    function example() {
      console.log(named); // => undefined
    
      named(); // => TypeError named is not a function
    
      var named = function named() {
        console.log('named');
      }
    }
  • 14.4?函數(shù)聲明的名稱和函數(shù)體都會(huì)被提升。

    function example() {
      superPower(); // => Flying
    
      function superPower() {
        console.log('Flying');
      }
    }
  • 想了解更多信息,參考?Ben Cherry?的?JavaScript Scoping & Hoisting
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)