Während der Migration des Projektcodes aufgetreten, zum Beispiel:
const getPersonInfo = (type: number) => {
switch (type) {
case 1:
const name = '张三'; // Error: Unexpected lexical declaration in case block.eslint
break;
case 2:
const name = '李四';
console.log(name); // Uncaught SyntaxError: Identifier 'name' has already been declared
break;
default:
break;
}
};
getPersonInfo(2);
Es ist ersichtlich, dass sich die in Fall 1 und Fall 2 definierten Felder theoretisch nicht gegenseitig beeinflussen sollten, aber aufgrund der Förderung des Umfangs wird Fall 1 Fall 2 beeinflussen.
Offizielle Dokumente erklären, dass es falsch ist, let, const, function und class direkt unter case oder default zu verwenden, und dass geschweifte Klammern verwendet werden müssen.
const getPersonInfo = (type: number) => {
switch (type) {
case 1: {
const name = '张三';
break;
}
case 2: {
const name = '李四';
console.log(name);
break;
}
default:
break;
}
};
getPersonInfo(2);
Das Folgende ist ein Beispiel aus dem offiziellen Dokument: (Die falsche Schreibweise besteht darin, die geschweiften Klammern zu entfernen, daher werde ich sie hier nicht veröffentlichen.)
// Declarations outside switch-statements are valid
const a = 0;
switch (foo) {
// The following case clauses are wrapped into blocks using brackets
case 1: {
let x = 1;
break;
}
case 2: {
const y = 2;
break;
}
case 3: {
function f() {}
break;
}
case 4:
// Declarations using var without brackets are valid due to function-scope hoisting
var z = 4;
break;
default: {
class C {}
}
}