这个高阶函数有什么问题?

时间:2012-05-15 10:43:39

标签: javascript higher-order-functions

mathOp =  function(type){
            return (
               "add" == type?  function(a,b){return a + b}
              :"mul" == type?  function(a,b){return a * b}
              :"sub" == type?  function(a,b){return a - b}
              :"div" == type?  function(a,b){return a / b}

            )
         }

Chrome JS调试工具说: SyntaxError:意外的令牌

这种语法有什么问题?

2 个答案:

答案 0 :(得分:5)

您忘记了上一个: else部分。

mathOp =  function(type){
            return (
               "add" == type?  function(a,b){return a + b}
              :"mul" == type?  function(a,b){return a * b}
              :"sub" == type?  function(a,b){return a - b}
              :"div" == type?  function(a,b){return a / b}
              : function() { return NaN; /* or throw an exception */ }
            )
         }

您可以使用switch()

使其更具可读性
function mathOp(type) {
    switch(type) {
        case 'add': return function(a,b) { return a + b; };
        case 'mul': return function(a,b) { return a * b; };
        case 'sub': return function(a,b) { return a - b; };
        case 'div': return function(a,b) { return a / b; };
    }
}

答案 1 :(得分:4)

如前所述,a:失踪了。

但是,这是改进此代码的另一种方法。将操作放在表中(作为对象实现):

var ops = {
  add: function(a, b) {return a + b;},
  mul: function(a, b) {return a * b;},
  sub: function(a, b) {return a - b;},
  div: function(a, b) {return a / b;}
};

然后让mathOp执行表查找,如果没有找到op,则采取适当的错误处理:

function mathOp(mytype) {
    var op = ops[mytype];
    if(!op) {
        ... error-handling ...
    }
    return op;
}

这样做的好处是,op函数只创建一次,而不是每次调用mathOp,它更容易扩展,如果需要,表可以被其他函数使用。