想问下 下面俩段代码 中,ts报错 为什么。
const expr = 'Papayas';
switch (expr) {
case 'Oranges':
let a = 123;
console.log('Oranges are $0.59 a pound.',a);
break;
case 'Papayas':
let a = 456;
console.log('Mangoes and papayas are $2.79 a pound.',a);
break;
default:
console.log(`Sorry, we are out of ${expr}.`);
}
const expr = 'Oranges';
switch (expr) {
case 'Oranges':
let a = 123;
console.log('Oranges are $0.59 a pound.',a);
break;
case 'Papayas':
a = 456;
console.log('Mangoes and papayas are $2.79 a pound.',a);
break;
default:
console.log(`Sorry, we are out of ${expr}.`,a);
}
才发现第一种也是有问题的 ,好奇怪
我个人一直以为第一种写法是对的,但是ts报错提示我重复定义了,我就改成第二种写法写的,结果发现 build 以后(webpack) 就变成这样了,导致变量没有定义,为什么会有这样奇怪的行为
chunk代码就成这样了,代码中就会生成一个r 变量,这个变量没有定义就被使用。。。
有点搞不清楚了,大佬快来讲讲。
这两段 TypeScript 代码的报错原因都与 JavaScript/TypeScript 的 块级作用域 和 switch 语句特性 有关。
第一段代码报错原因:
原因:
case共享同一个作用域,并不是每个case有独立的作用域。case 'Oranges'和case 'Papayas'中分别用let a声明变量时,相当于在同一个作用域内重复声明同名变量a。let声明的变量具有块级作用域,且在同一个作用域内不允许重复声明。第二段代码报错原因:
原因:
a的声明被限制在case 'Oranges'的代码块中。虽然switch的case共享作用域,但a的声明只有在case 'Oranges'执行时才会发生。expr的值是'Papayas',代码会直接跳转到case 'Papayas',此时a尚未声明,直接赋值a = 456会导致“变量在声明前使用”的报错。default分支中访问a时,如果a未被任何case声明(例如expr是其他值),也会导致“变量未定义”的错误。解决方案:
TypeScript 的报错是由于switch语句的case共享作用域导致的变量重复声明或作用域不明确。通过统一声明变量或用{}隔离作用域即可解决。方法 1:统一声明变量
在
switch语句外部声明变量,避免重复声明或作用域问题:方法 2:为每个
case创建独立作用域用
{}包裹每个case的代码,强制创建独立块级作用域: