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
  }
}

会报错的原因是代码中只要一个作用域,即花括号({})包扩的部份,处理的要领:

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 中所有的定义都会被提拔(hoist),即var, let, const, function, function*, class。

然则var,function,function*在“实例阶段”(instantiated),会被初始化为undefined。

而let,const,class则没有被初始化(emporal dead zone),所以在实行阶段的时刻,在定义它们的代码运行前接见会致使ReferenceError。

spec:Let and Const Declarations

    原文作者:LiuuY
    原文地址: https://segmentfault.com/a/1190000010203430
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞