ES6阻止在切换中使用

时间:2016-08-08 12:10:56

标签: javascript ecmascript-6

在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架构中的常见模式。

2 个答案:

答案 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}}