2012-05-15 5 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

코드를 유지 관리하는 모든 사람들의 온상 (sanity)을 위해 '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

으로 이미 언급, 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이 호출 될 때마다 한 번만 생성되고,보다 쉽게 ​​확장 가능하며 필요한 경우 다른 함수에서 테이블을 사용할 수 있습니다.

관련 문제