ES6 或 TS 引入了块级作用域,通过let和const、class等可以定义块级作用域里的变量,块级作用域内的变量不存在变量提升,且存在暂时性死区
(在代码块内,使用let或const声明变量前该变量都是不可改变的)。常见的if语句,for循环的循环体内都可以定义块级变量。那么switch语句中的块级作用域是什么呢? 先给出结论:
switch语句中的块级作用域,在整个switch语句中,而不是对于每一个case生成一个独立的块级作用域。
举个栗子🌰
1
2
3
4
5
6
7
8let number = 1;
switch(number){
case 1:
let name = 'cosyer';
default:
console.log(name)
}
// cosyer
1 | let number = 1; |
可能存在的问题
1 | let number = 1; |
1 | let number = 2; |
这里虽然case里面定义的块级虽然不会存在变量提升,但是会存在暂时性锁区,也就是说如果let name = ‘cosyer’ 没有执行,也就是name定义的过程没有执行,那么name在整个块级作用域内都是不可用的,都是undefined。
所以尽量不要在case里定义块级变量。