2009-09-30 11 views
5

私はこのjsonを持っています。このjsonを取得すると、コールバックオブジェクトにある関数を実行する必要があります。オブジェクト形式でevalのパラメータを渡すには?

{ 
    formId: 'snn_service_item_form', 
    item_id: '1', 
    item_title: 'some item', 
    item_description: '', 
    item_duration: '10', 
    item_price: '120', 
    item_level_1 : 1, 
    item_level_2 : 0, 
    item_level_3 : 1, 
    item_type: 'p', 
    callback : { 
     callbackName : 'getServices', 
     callbackParams : { 
      _param1 : 1, 
      _param2 : 2 
    } 
} 
} 

ので、これに応じて、私はこれを実行する必要があります。

getServices(1,2); 

私のようにeval関数でそれを行うことができます。

eval(json.callback.callbackName+'(\''+ json.callback.callbackNParams._param1 +'\',\''+ json.callback.callbackNParams._param2 +'\')'); 

私はにそれを置くことによって、これを自動化することができます文字列にパラメータを書いていますが、これは最善の方法だとは思いません。

VARから関数名を割り当てる方法があるとのように私の場合には、オブジェクトとしてそのパラメータを与える:私は、これはそれを行うための方法ではありません知っている

json.callback.callbackName(json.callback.callbackParams); 

が、それは何をである私学びたい

ありがとう、Sinan。

+0

答えをいただきありがとうございます。私は電話をして、それを稼働させるために応募します。 – Sinan

答えて

10

呼び出す関数が定義されている場所(グローバルスコープまたはローカルスコープ)によって異なります。

グローバルた場合、あなたはevalを必要としない(と、それはそれを避けるために、より安全です)、あなただけのグローバルwindowオブジェクトを介して関数を参照:

var args = []; 
for(var p in json.callback.callbackParams) { 
    args.push(json.callback.callbackParams[p]); 
} 
window[json.callback.callbackName].apply(null, args) 

は、上記の使用apply() functionを参照してください。

ローカルスコープの場合は、eval(どのように正常に動作しているか)が必要です。

+0

ローカルスコープの場合、 'eval'を使用して関数オブジェクトを取得し、さらに信頼性の高い' apply'メソッドを使用して呼び出すことができます。ところで、 'for(in)'があなたが望む順序でparamsを返すことは保証されていません。 – bobince

1

evalは使用しないでください。

var callbackfunction= window[json.callback.callbackName]; 

そして、ちょうど彼らが愚かである信頼できないJavaScriptに戻って解析され持っている文字列に自分の価値観をシリアライズしようとしている:あなたはwindowオブジェクトからという名前のグローバル変数や関数への参照を取得することができます。明示的に関数を呼び出します。

callbackfunction.call(window, json.callback.callbackParams.param1, json.callback.callbackParams.param2); 

(。ここwindowを使用すると、オブジェクトのメソッドを使用していないときのためにthisためのダミー値である)任意の数のパラメータをオンにするだろう受け入れるように、それを自動化するためのより良い

その後、

callbackParams: [1, 2] 

と機能を呼び出すためにapplyを使用します:

平野配列にcallbackParams
+2

'func.call(null、...)'は 'func.call(window、...)'と同じ(よく、ほとんど)動作をします。 'this'値をグローバルオブジェクトとして呼び出す関数です。おそらく初心者の方には分かりにくいかもしれませんが、短くなっています。 – kangax

関連する問題