2012-05-15 20 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,它更容易擴展,如果需要的話,該表可以被其他函數使用。