switch的块级作用域

ES6 或 TS 引入了块级作用域,通过let和const、class等可以定义块级作用域里的变量,块级作用域内的变量不存在变量提升,且存在暂时性死区(在代码块内,使用let或const声明变量前该变量都是不可改变的)。常见的if语句,for循环的循环体内都可以定义块级变量。那么switch语句中的块级作用域是什么呢? 先给出结论:

switch语句中的块级作用域,在整个switch语句中,而不是对于每一个case生成一个独立的块级作用域。


举个栗子🌰

1
2
3
4
5
6
7
8
let number = 1;
switch(number){
case 1:
let name = 'cosyer';
default:
console.log(name)
}
// cosyer

1
2
3
4
5
6
7
8
9
10
11
12
let number = 1;
switch(number){
case 1:
let name = 'cosyer';
break;
case 2:
let name = 'yu';
break;
default:
console.log(name);
}
// Uncaught SyntaxError: Identifier 'name' has already been declared

可能存在的问题

1
2
3
4
5
let number = 1;
switch(number){
case 1 : name = 'cosyer'; break;
}
// name虽然没有声明,但是给name赋值相当于给全局的window对象复制,也就是window.name = 'cosyer'。
1
2
3
4
5
6
7
8
9
10
let number = 2;
switch(number){
case 1:
let name = 'cosyer';
break;
case 2:
name = 'yu';
break;
}
// Uncaught ReferenceError: name is not defined

这里虽然case里面定义的块级虽然不会存在变量提升,但是会存在暂时性锁区,也就是说如果let name = ‘cosyer’ 没有执行,也就是name定义的过程没有执行,那么name在整个块级作用域内都是不可用的,都是undefined。

所以尽量不要在case里定义块级变量。

本文结束感谢您的阅读

本文标题:switch的块级作用域

文章作者:陈宇(cosyer)

发布时间:2019年03月10日 - 00:03

最后更新:2020年06月02日 - 23:06

原始链接:http://mydearest.cn/2019/switch%E7%9A%84%E5%9D%97%E7%BA%A7%E4%BD%9C%E7%94%A8%E5%9F%9F.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!