图片授权基于 www.pixabay.com 相关协议
switch(表达式) {
case n:
代码块
break;
case n:
代码块
break;
default:
默认代码块
}
break 关键词:跳出 switch 代码块;
default 关键词:无 case 匹配项的时候,执行;
switch 的作用域只有一个,包含里面 case 语句,都属于同一个作用域。
如果里面声明 let 变量,可就要注意了。
首先 let 声明的变量只能在「当前作用域」有效;并且使用 let 声明之前,该变量不可用,这在语法上称「暂时性死区」;所以 let 声明的变量,一定要在声明后使用;
var x = 100,c = \\\'b\\\';
switch (c) {
case \\\'a\\\':
let x = 200;
console.log(x);
break;
case \\\'b\\\':
x = 300;
console.log(x);
break;
}
//Cannot access \\\'num\\\' before initialization
//未初始化之前不能使用
走逻辑 b ,说明 let x 并没有初始化;
var x = 100,c = \\\'b\\\';
switch (c) {
case \\\'a\\\':
let x = 200;
console.log(x);
break;
case \\\'b\\\':
let x = 300;
console.log(x);
break;
}
//Identifier \\\'x\\\' has already been declared
//标识符已被声明过
走逻辑 b ,但标识符已经被声明了。
那第一个 case 里面的 let x = 200,到底在执行什么?
那就要引申出 let 的暂时性死区。就是说,只要一进入当前作用域,需要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
虽然第一个 case 的 let x = 200 没有执行,但是 x 是存在作用域中的,因为没有词法绑定,所以不能被获取,只有声明它的时候才能获取和使用。
所以,我们用 let 的特性来证明了 switch 的作用域问题,无论多少个 case 都在一个作用域里。
如果非要在 case 里区分作用域,可以用 {} 号来处理。
switch (c) {
case \\\'a\\\':{
//单独作用域
}
case \\\'b\\\':{
//单独作用域
}
}
参考资料:
[1]极客时间《JavaScript 核心原理解析》
[2]http://www.ecma-international.org/ecma-262/6.0/#sec-let-and-const-declarations
[3]http://es6.ruanyifeng.com/#docs/let
[4]https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch
推荐阅读
JavaScript 装箱和拆箱
Ajax 如何下载文件
JavaScript 表达式和运算符
原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34565.html