How to pass parameters in eval in an object form?

How to pass parameters in eval in an object form?

http://stackoverflow.com/questions/1500745/how-to-pass-parameters-in-eval-in-an-object-form

I have this json, and when i get this json i need to run the function which comes at callback object.

{
    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 
    } 
} 
}

so according to this i need to run this:

getServices(1,2);

i can do that with eval function like:

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

i can automate this by putting it into a for in and writing parameters to a string, but i dont think this is the best way to go.

is there a way to assign function name from a var and giving its parameters as an object, in my case like:

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

i know this is not the way to do it but it is what i want to learn.

Thanks, Sinan.

share|improve this question
 
thanks for the answers, i'll work on call and apply to get that running. –  Sinan Yasar Sep 30 '09 at 22:17

2 Answers

up vote 5 down vote accepted

Depends on where the function to call is defined (global scope or a local scope).

If global, you don't need eval (and it's safer to avoid it), you just reference the function through the global window object:

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

See the apply() function used above.

If it's in a local scope, then you need the eval (how you have it is fine).

share|improve this answer
 
For a local scope, you could use the eval just to get the function object, and then still use the more-reliable apply to call it. BTW it's not guaranteed that for(in) will return the params in the order you want. –  bobince Sep 30 '09 at 21:39

Don't use eval. You can get a reference to a named global variable or function from the window object:

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

And trying to serialise your values to a string just to have them parsed back to JavaScript unreliably is silly. Call the function explicitly:

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

(window here is a dummy value for this for when you're not using object methods.)

Better for automating it to accept any number of parameters would be to turn callbackParams into a plain Array:

callbackParams: [1, 2]

and then use apply to call the function:

callbackfunction.apply(window, json.callback.callbackParams);
share|improve this answer
2  
func.call(null, ...) will give you the same (well, almost) behavior as func.call(window, ...) — invoking function with this value being global object. It's shorter, although probably less descriptive for beginners. –  kangax Oct 11 '09 at 7:13
posted @ 2013-10-19 18:32  alxe_yu  阅读(148)  评论(0)    收藏  举报