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

你可能感兴趣的:(javascript,let,const)