6

このjsonがあり、このjsonを取得したら、コールバックオブジェクトにある関数を実行する必要があります。

{
  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 +'\')');

これを for に入れ、パラメータを文字列に書き込むことでこれを自動化できますが、これが最善の方法だとは思いません。

var から関数名を割り当て、そのパラメーターをオブジェクトとして指定する方法はありますか?私の場合は次のようになります。

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

私はこれがそれを行う方法ではないことを知っていますが、それは私が学びたいことです.

ありがとう、シナン。

4

2 に答える 2

13

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

グローバルの場合は必要ありません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()上で使用した関数を参照してください。

ローカルスコープにある場合は、が必要ですeval(どのように持っているかは問題ありません)。

于 2009-09-30T21:29:58.633 に答える
2

評価を使用しないでください。windowオブジェクトから名前付きグローバル変数または関数への参照を取得できます。

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

また、値を文字列にシリアライズして、値を解析して JavaScript に戻そうとするのはばかげています。関数を明示的に呼び出します。

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

(これは、オブジェクト メソッドを使用していない場合windowの for のダミー値です。)this

任意の数のパラメーターを受け入れるように自動化するには、callbackParams をプレーンな配列に変換することをお勧めします。

callbackParams: [1, 2]

次にapply、関数を呼び出すために使用します。

callbackfunction.apply(window, json.callback.callbackParams);
于 2009-09-30T21:37:23.890 に答える