2011-07-31 3 views
0

기본 형식의 폴란드어 표기법 계산기를 구현하려고하며 각 작업을 정의하는 데 객체를 사용하고 있습니다.'this'with function.apply를 사용할 때 수락 된 규칙

new RPNCalculator().calculate([4, 5, '+']); 

를 호출하면 72

코드의 응답을 생성 할 것이다 9

new RPNCalculator().calculate([4, 5, '+', 3, 5, '+', '*']); 

의 응답을 생성 할 것이다

이러한 현재이다

function RPNCalculator(arr) { 

    this.calculate = function(arr) { 
     var resultArr =[]; 
     for(var i=0; i < arr.length; i++) { 
      if(typeof(arr[i]) == 'number') { 
       resultArr.push(arr[i]); 
      } 
      else { 
       var a = resultArr.pop(); 
       var b = resultArr.pop(); 
       var c = opers[arr[i]].apply(this, [a, b]); 
       resultArr.push(c); 
      } 
     } 
     return resultArr.pop(); 
    } 

    var opers = { 
     "+": function(a, b) { return a + b; }, 
     "-": function(a, b) { return a - b; }, 
     "*": function(a, b) { return a * b; }, 
     "/": function(a, b) { return a/b; } 
    } 
} 

계산 기능이 제대로 작동하지만 제가 알고 싶은 것은 다음 줄

var c = opers[arr[i]].apply(this, [a, b]); 

배열의 현재 인덱스의 기호에 따라 opers 객체의 내부에 포함 된 필요한 함수를 호출 할 수있는 가장 좋은 방법은, 또는 여부 그것을 할 수있는 더 좋은 방법이 있습니까?

답변

3

코드에 this에 대한 참조가 필요하지 않습니다. 기능이 클래스 멤버에서 작동하지 않기 때문입니다. 이 경우

, 당신은 간단하게 수행 할 수 있습니다

조금 청소기입니다
var c = opers[arr[i]](a, b); 

. 그러나 가장 읽기 쉽도록하려면 다음을 권합니다.

var operator = opers[arr[i]]; 
var c = operator(a, b); 
+0

... 그리고 더 강력하려면'var c = operator? operator (a, b) : parseInt ("");' – Tomalak

+0

답변을 주셔서 감사합니다. 함수가 클래스 멤버에서 작동하지 않는다고 할 때, 어떻게 의미합니까? a와 b가 RPNCalculator의 구성원이어야 함을 의미합니까? –

+0

작은 공간에서 설명하기는 어렵지만 올바르게 수행하고 있습니다 (a 및 b를 로컬 변수로 사용). 'Function.apply' 또는'Function.call'을 사용하면 효율적으로 'this'를 지정하고 객체를 할당 할 수 있습니다. 메서드를 직접 호출하면 (예제에서와 같이) 메소드의 생성 방법과 발견 된 위치에 따라 달라지는'this'의 기본값을 그대로 남겨 둡니다. 'this'의 장기 상태가 중요하다면'apply'가 필요하지만, 당신의 경우에는 그렇지 않습니다. – OverZealous

관련 문제