let 和 const 的坑

const someFunc = (something) => {
  switch (something) {
    case 'abc':
      const items = ['asdf']
      return items
    case 'xyz':
      const items = ['bla']
      //    ↑
      //    Babel complains here about a
      //    'Duplicate declaration "items"'
      //    (see below)
      //    Why??
      return items
  }
}

會報錯的緣由是代碼中只有一個做用域,即花括號({})包擴的部分,解決的方法:java

const someFunc = (something) => {
  switch (something) {
    case 'abc': { // 增長塊級做用域
      const items = ['asdf']
      return items;
    } // 
    case 'xyz': { // 增長塊級做用域
      const items = ['bla']
      return items;
    } //
  }
}

上面的例子對let也適用。git

  • hoistgithub

(function() {
    x; // undefined
    y; // Reference error: y is not defined

    var x = "local";
    let y = "local";
}());

上面的代碼並不意味着變量y沒有被提高。code

JavaScript 中全部的定義都會被提高(hoist),即var, let, const, function, function*, class。ip

可是var,function,function*在「實例階段」(instantiated),會被初始化爲undefined。作用域

而let,const,class則沒有被初始化(emporal dead zone),因此在執行階段的時候,在定義它們的代碼運行前訪問會致使ReferenceError。get

spec:Let and Const Declarationsit

相關文章
相關標籤/搜索