2009-09-30 5 views
5

J'ai ce json, et quand je reçois ce json j'ai besoin de lancer la fonction qui vient à l'objet callback.Comment transmettre des paramètres dans eval sous forme d'objet?

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

donc d'après ce que je dois exécuter ceci:

getServices(1,2); 

je peux le faire avec la fonction eval comme:

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

je peux automatiser ceci en mettant en pour dans et en écrivant des paramètres à une chaîne, mais je ne pense pas que c'est la meilleure voie à suivre.

est-il possible d'attribuer un nom de fonction d'un var et donnant ses paramètres comme un objet, dans mon cas comme:

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

Je sais que ce n'est pas la façon de le faire, mais il est ce que je vouloir apprendre.

Merci, Sinan.

+0

merci pour les réponses, je vais travailler sur appel et appliquer pour que cela fonctionne. – Sinan

Répondre

10

Dépend de l'emplacement où la fonction à appeler est définie (portée globale ou étendue locale).

Si globale, vous n'avez pas besoin eval (et il est plus sûr d'éviter), vous faites référence à la fonction que par le window objet global:

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

Voir la apply() function utilisée ci-dessus.

Si c'est dans une portée locale, alors vous avez besoin de eval (comment ça se passe).

+0

Pour une portée locale, vous pouvez utiliser 'eval' juste pour obtenir l'objet fonction, puis utiliser le' apply' plus fiable pour l'appeler. BTW n'est pas garanti que 'for (in)' retournera les params dans l'ordre que vous voulez. – bobince

1

Ne pas utiliser eval. Vous pouvez obtenir une référence à une variable globale nommée ou la fonction de l'objet window:

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

Et en essayant de serialise vos valeurs à une chaîne juste pour les avoir analysés de retour à JavaScript est unreliably stupide. Appelez la fonction explicitement:

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

(. window ici est une valeur factice pour this lorsque vous n'êtes pas en utilisant des méthodes d'objet)

mieux pour l'automatisation à accepter un certain nombre de paramètres serait de tourner callbackParams dans un tableau simple:

callbackParams: [1, 2] 

puis utilisez apply pour appeler la fonction:

callbackfunction.apply(window, json.callback.callbackParams); 
+2

'func.call (null, ...)' vous donnera le même comportement (presque, presque) que 'func.call (window, ...)' - invoquant la fonction avec la valeur 'this' étant un objet global. C'est plus court, bien que probablement moins descriptif pour les débutants. – kangax

Questions connexes