來自twitter的問題:https://twitter.com/mxstbr/st...javascript
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