How to pass parameters in eval in an object form?
Solution 1
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).
Solution 2
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);
Comments
-
Sinan almost 2 years
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.
-
Amit Patil over 14 yearsFor a local scope, you could use the
eval
just to get the function object, and then still use the more-reliableapply
to call it. BTW it's not guaranteed thatfor(in)
will return the params in the order you want. -
kangax over 14 years
func.call(null, ...)
will give you the same (well, almost) behavior asfunc.call(window, ...)
— invoking function withthis
value being global object. It's shorter, although probably less descriptive for beginners.