2011-07-31 13 views
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オブジェクト内部に含まれる必要な機能を呼び出すための最善の方法がある、またはかどうかでありますそれを行うための良い方法はありますか?

答えて

3

コード内にthisという参照は必要ありません。そのクラスのメンバーで機能が動作していないからです。この場合

、あなたは、単に行うことができます:少しクリーナーです

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

。しかし、私はこれをお勧めします:

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

...と私は 'var c = operator?演算子(a、b):parseInt( ""); ' – Tomalak

+0

答えをいただき、ありがとうございます。関数がクラスメンバ上で動作していないと言ったら、どういう意味ですか? aとbはRPNCalculatorのメンバーになるはずですか? –

+0

小さなスペースで説明するのは難しいですが、正しく実行しています(aとbをローカル変数にする)。 'Function.apply'や' Function.call'を使うと効果的に 'this'を代入してオブジェクトを表現します。メソッドを直接呼び出すだけの場合(私の例のように)、メソッドの作成方法と場所が非常に異なる 'this'のデフォルト値をそのまま残しています。 'this'の長期的な状態が重要であれば' apply'が必要ですが、あなたの場合はそうではありません。 – OverZealous

関連する問題