来自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 中所有的定义都会被提拔(hoist),即var, let, const, function, function*, class。
然则var,function,function*在“实例阶段”(instantiated),会被初始化为undefined。
而let,const,class则没有被初始化(emporal dead zone),所以在实行阶段的时刻,在定义它们的代码运行前接见会致使ReferenceError。