如何在对象表单中传递eval中的参数?

时间:2009-09-30 21:24:34

标签: javascript json eval

我有这个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);

我知道这不是这样做的方法,但这是我想要学习的内容。

谢谢,思南。

2 个答案:

答案 0 :(得分:12)

取决于定义要调用的函数的位置(全局范围或本地范围)。

如果是全局的,则不需要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(如何使用它)。

答案 1 :(得分:2)

不要使用eval。您可以从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);