Что не так в этой функции высшего порядка?

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: Unexpected token )

Что не так с этим синтаксисом?


person Amogh Talpallikar    schedule 15.05.2012    source источник
comment
Пожалуйста, для здравомыслия всех людей, которые поддерживают ваш код, измените это на оператор switch или if/ else.   -  person Matt    schedule 15.05.2012
comment
Я получил это! На самом деле я видел этот стиль когда-то для проверки JS. и я думал, что это коротко и мило, но только что узнал, как это влияет на читабельность кода.   -  person Amogh Talpallikar    schedule 15.05.2012


Ответы (2)


Вы забыли последнюю : 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; };
    }
}
person ThiefMaster    schedule 15.05.2012

Как уже упоминалось, 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 выполнить поиск в таблице, приняв соответствующую обработку ошибок, если операция не найдена:

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

Это имеет то преимущество, что функции op создаются только один раз, а не каждый раз, когда вызывается mathOp, его легче расширять, и таблица может использоваться другими функциями, если это необходимо.

person Matt Fenwick    schedule 16.05.2012