递归切换语句

时间:2012-08-27 12:37:58

标签: javascript switch-statement

模式 随机时,我获得递归Switch语句的undefined值。这个想法是最随机的id,它会随机选择一个数字并设置新模式并返回原始的switch语句。

当模式不是随机时,Everthing工作正常。所以我不确定这里有什么问题。
变量a是模式,而i,j只是数字。

switchMode: function (i, j, a){
            var b;
            console.log(a);
            switch(a) {
                default:
                case 'add':
                    console.log(i, j);
                    b = i + j;
                    break;

                case 'minus':
                    console.log(i, j);
                    b = i - j; //negative numbers possible
                    break;

                case 'multiply':
                    console.log(i, j);
                    b = i * j; //0 possible
                    break;  

                case 'random':
                    this.randomSwitchMode(i, j);
                    break; //random
            }   
            return b;
        },



randomSwitchMode: function(i, j) {
            var c = Math.ceil(Math.random() * 3);

            console.log(i, j, c);

            switch(c) {
                default:
                case 1: 
                    var a = 'add';
                    console.log(a);
                    this.switchMode(i, j, a);
                    break;

                case 2: 
                    var a = 'minus';
                    console.log(a);
                    this.switchMode(i, j, a);
                    break;

                case 3:
                    var a = 'multiply';
                    console.log(a);
                    this.switchMode(i, j, a);
                    break; 
            } 
        }

1 个答案:

答案 0 :(得分:2)

你没有从“randomSwitchMode”返回任何内容。即使你这样做,你也必须确保在“switchMode”中将其返回值分配给“b”。

因此,随机案例应如下:

            case 1: 
                var a = 'add';
                console.log(a);
                return this.switchMode(i, j, a);

然后在“switchMode”中:

            case 'random':
                b = this.randomSwitchMode(i, j);
                break; //random

既然你要解决所有这些麻烦,我提出的建议是,不要使用switch语句,而是保留一个将操作名称映射到函数的对象:

switchMode: function (i, j, a) {
  var ops = {
    'add': function(i, j) { return i + j; },
    'minus': function(i, j) { return i - j; },
    'multiply': function(i, j) { return i * j; },
    'random': function(i, j) {
      return ops[['add', 'minus', 'multiply'][Math.floor(Math.random() * 3)]](i, j);
    }
  };
  return ops[a](i, j);
}

您可以将“随机”案例拆分出来并以不同的方式处理它。总的来说,虽然switch语句没有任何内在错误,但基于数据结构的实现将更加灵活。