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 in 并将参数写入字符串来自动执行此操作,但我认为这不是最好的方法。

有没有办法从 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这里是一个虚拟值。)this

更好的自动化它接受任意数量的参数是将 callbackParams 变成一个普通的数组:

callbackParams: [1, 2]

然后apply用来调用函数:

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