letとconstのピット


  • twitterからの質問:https://twitter.com/mxstbr/st...
  • 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
      }
    }
    エラーの原因は、コードの中には機能領域が一つしかないからです.つまり、括弧({})で拡大された部分を包んで、解決する方法は以下の通りです.
    const someFunc = (something) => {
      switch (something) {
        case 'abc': { //        
          const items = ['asdf']
          return items;
        } // 
        case 'xyz': { //        
          const items = ['bla']
          return items;
        } //
      }
    }
    上記の例はletにも適用されます.
  • Hoist
  • (function() {
        x; // undefined
        y; // Reference error: y is not defined
    
        var x = "local";
        let y = "local";
    }());
    上のコードは変数yが向上していないという意味ではありません.
    JavaScriptにおけるすべての定義は、var、let、const、function、function*、classとして向上されます.
    しかし、var、function、function*は「インスタンスフェーズ」でundefinedに初期化されます.
    let,const,classは初期化されていないので,実行段階において,コードを定義する前にアクセスするとReferenceErrにつながる.
    spec:Let and Const Declarations