0

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

当模式不是随机的时,一切正常。所以我不确定这里有什么问题。
变量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; 
            } 
        }
4

1 回答 1

3

你没有从“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声明本身没有任何问题,但基于数据结构的实现将更加灵活。

于 2012-08-27T12:40:57.327 回答