letとconstのピット
1519 ワード
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にも適用されます.(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