0
私はプリミティブ型のポーランド表記計算機を実装しようとしていますが、オブジェクトを使用して各操作を定義しています。function.applyで 'this'を使用する場合に受け入れられる慣習
new RPNCalculator().calculate([4, 5, '+']);
を呼び出すと、9か
new RPNCalculator().calculate([4, 5, '+', 3, 5, '+', '*']);
の答えは72
コードの答えを生産する生産するような
ここにある:
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?演算子(a、b):parseInt( ""); ' – Tomalak
答えをいただき、ありがとうございます。関数がクラスメンバ上で動作していないと言ったら、どういう意味ですか? aとbはRPNCalculatorのメンバーになるはずですか? –
小さなスペースで説明するのは難しいですが、正しく実行しています(aとbをローカル変数にする)。 'Function.apply'や' Function.call'を使うと効果的に 'this'を代入してオブジェクトを表現します。メソッドを直接呼び出すだけの場合(私の例のように)、メソッドの作成方法と場所が非常に異なる 'this'のデフォルト値をそのまま残しています。 'this'の長期的な状態が重要であれば' apply'が必要ですが、あなたの場合はそうではありません。 – OverZealous