Как передать параметры в Eval в форме объекта? - PullRequest
6 голосов
/ 01 октября 2009

У меня есть этот 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 ]

12 голосов
/ 01 октября 2009

Зависит от того, где определена вызываемая функция (глобальная или локальная область).

Если глобальный, вам не нужно 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 (как у вас это хорошо).

2 голосов
/ 01 октября 2009

Не используйте 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);
...