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
객체의 내부에 포함 된 필요한 함수를 호출 할 수있는 가장 좋은 방법은, 또는 여부 그것을 할 수있는 더 좋은 방법이 있습니까?
... 그리고 더 강력하려면'var c = operator? operator (a, b) : parseInt ("");' – Tomalak
답변을 주셔서 감사합니다. 함수가 클래스 멤버에서 작동하지 않는다고 할 때, 어떻게 의미합니까? a와 b가 RPNCalculator의 구성원이어야 함을 의미합니까? –
작은 공간에서 설명하기는 어렵지만 올바르게 수행하고 있습니다 (a 및 b를 로컬 변수로 사용). 'Function.apply' 또는'Function.call'을 사용하면 효율적으로 'this'를 지정하고 객체를 할당 할 수 있습니다. 메서드를 직접 호출하면 (예제에서와 같이) 메소드의 생성 방법과 발견 된 위치에 따라 달라지는'this'의 기본값을 그대로 남겨 둡니다. 'this'의 장기 상태가 중요하다면'apply'가 필요하지만, 당신의 경우에는 그렇지 않습니다. – OverZealous