所以有可能将这个案例转变成另一个案例:
switch(variable) {
case 1:
// do something 1
case 2:
// do something 2
break;
case 3:
// do something 3
break;
}
但是如果我们想在完成主案例后执行多个其他案例,或者在主案例之后直接执行其他不是的案例怎么办?
例如伪代码:
switch(variable) {
case 1:
// do something 1
break;
case 2:
// do something 2
break;
case 3:
// do something 3
execute case 2;
execute case 1;
break;
}
我研究了标记语句的选项,但它似乎在这里不起作用。
我在这里看到的唯一选择是为每种情况创建新函数,但我想知道 - 是否有更好、更干净、更易读和/或更短的选项?
我正在寻找所有提示 - 无论是我缺少的某个关键字、您干净利落地完成此操作的个人提示,还是库,甚至来自其他语言(如打字稿等)的命题。
尼克帕森提出了这个很棒的想法:
也许将整个开关包装在一个接受变量的函数中并进行递归调用?
在这种情况下效果非常好;因此,将其合并到我发布的示例中并接受它作为答案:
mySwitch(variable);
function mySwitch(_v) {
switch(_v) {
case 1:
// do something 1
break;
case 2:
// do something 2
break;
case 3:
// do something 3
mySwitch(2);
mySwitch(1);
break;
}
}
它很干净,可以解决问题...此外 - 如果您在 switch 语句通常所在的位置声明函数(例如在某个外部函数内),您将能够更改在外部函数中声明的变量,就像您一样能够进入 switch 语句。
(我会在 2 天内接受这个答案,将此问题标记为已回答,除非 Nick 会发布自己的答案以获取信用)
从我上面的评论...
使用命名函数怎么样? ...就像
、doSomething_1
、doSomething_2
,其中后者是这样实现的...doSomething_3
,并且其中为每个匹配案例调用一个特定于案例的函数。function doSomething_3() { doSomething_2(); doSomething_1(); }
既然OP显然控制着switch-case相关代码,为什么不将每个案例的具体处理作为自己的函数来实现。因此,首先将特定于案例的处理的实现与
mySwitch
函数(OP 自己的答案之一)解耦,其次为 OP 示例代码的第三个案例启用代码重用。
在我看来,下一个提供的示例代码比OP在他自己的答案中提出的内容更容易理解......
function mySwitch(value) {
switch (value) {
case 1:
handleCase1();
break;
case 2:
handleCase2();
break;
case 3:
handleCase3();
break;
}
}
console.log('mySwitch(1) ...');
mySwitch(1);
console.log('mySwitch(2) ...');
mySwitch(2);
console.log('mySwitch(3) ...');
mySwitch(3);
.as-console-wrapper { min-height: 100%!important; top: 0; }
<script>
function handleCase1() {
console.log('handling case 1');
}
function handleCase2() {
console.log('handling case 2');
}
function handleCase3() {
console.log('handling case 3 which invokes handling of 2 and 1');
handleCase2();
handleCase1();
}
</script>
...如果开关值显然是基于字符串或数字,则可以将上述
mySwitch
函数缩短为 ...
function mySwitch(value) {
({
'1': handleCase1,
'2': handleCase2,
'3': handleCase3,
})[String(value)]?.();
}
console.log('mySwitch(0) ...');
mySwitch(0);
console.log('mySwitch(1) ...');
mySwitch(1);
console.log('mySwitch(2) ...');
mySwitch(2);
console.log('mySwitch(3) ...');
mySwitch(3);
console.log('mySwitch(4) ...');
mySwitch(4);
.as-console-wrapper { min-height: 100%!important; top: 0; }
<script>
function handleCase1() {
console.log('handling case 1');
}
function handleCase2() {
console.log('handling case 2');
}
function handleCase3() {
console.log('handling case 3 which invokes handling of 2 and 1');
handleCase2();
handleCase1();
}
</script>