在ES6中,我可以实现每个案例的块范围:
switch(somVar){
case 'first':
{
let itemId='foo';
}
break;
case 'second':
{
let itemId='bar';
}
}
显然,itemId
也可以在最前面宣布
对于我的用例,本地范围的变量更有意义,因为在我的整体代码中,它更容易识别正在发生的事情,并且有一些case
,而一些块包含有问题的变量而其他块包含“T。
我没有看到switch/case
使用的块范围作为常用用法
我的问题很简单,是否有理由不这样做,风格明智或其他。
编辑,更新示例代码以避免混淆:
const someFunc(action) => {
switch(action.type){
case 'first':
{
let itemId=action.someObj.someProp.id;
//Do something with itemId
}
break;
case 'second':
{
let itemId=action.someObj.someProp.id;
//Do something with itemId
}
break;
case 'third':
//No use of itemId
}
}
itemId可以在顶部声明,但我更愿意查看每个案例的属性。似乎没有直接的理由在不同的情况下共享变量。对于基本相同的东西来说,“发明”一个不同的名称似乎也是无稽之谈。
这可能用不同的方式编写,但这个例子是Flux架构中的常见模式。
答案 0 :(得分:1)
将逻辑抽象为函数。切换语句本身很难阅读,更不用说一堆逻辑和变量作用域。将逻辑抽象为函数要好得多。在对函数进行抽象之后,您可能会注意到,并不需要将switch语句放在一起。请参阅DockYard样式指南的Avoid use of switch statements部分。
function handleFirstCase() {
var itemId = 'foo';
// Do stuff with itemId
return expectedValue;
}
function handleSecondCase() {
var itemId = 'bar';
// Do stuff with itemId
return expectedValue;
}
let result;
switch(somVar){
case 'first':
result = handleFirstCase();
break;
case 'second':
result = handleSecondCase();
break;
}
注意switch语句如何变成一行。这可以很容易地被提炼为字典查找:
const CASES = {
first() {
var itemId = 'foo';
// Do stuff with itemId
return expectedValue;
},
second() {
var itemId = 'bar';
// Do stuff with itemId
return expectedValue;
}
};
let result = CASES[someVar]();
答案 1 :(得分:1)
由于“break”语句是可选的,因此切换场景出现的问题作为单个块处理,而不管个别案例的状态如何。
将代码重写为以下代码应该完成这项工作:
{{1}}