2012-05-15 23 views
1
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} 

      ) 
     } 

铬JS调试工具说:语法错误:意外的令牌)这个高阶函数有什么问题?

有什么不对这种语法?

+5

为了所有维护代码的人的智慧,请将其改为switch或if/else语句。 – Matt

+0

我知道了!我真的看到这种风格的时间回到JS验证。 ,我认为它简短而又甜蜜,但只是知道它对代码的可读性有什么作用。 –

回答

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; }; 
    } 
} 
4

正如已经提到的,:失踪。

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

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执行表查找,采取适当的错误处理,如果没有运算发现:

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

这具有的优点op函数只能被创建一次,而不是每次调用mathOp,它更容易扩展,如果需要的话,该表可以被其他函数使用。