2010-11-12 7 views
1

J'ai créé un objet qui appartient à une classe particulière.alternative à eval en Javascript

  var schCom1 = Server.CreateObject(ArchiveProgID); 

Maintenant, cet objet appelle la méthode qui est décidée dynamiquement.

  fnName += "("; 
     for (counter=0;counter<fnArgs.length;counter++) 
     { 
      if(counter > 0) 
       fnName += ","; 
      fnName += fnArgs[counter]; 
     } 
     fnName += ")"; 
     writeComment("Ready to call method:" + "schCom1." + fnName); 
     // according to the type of recurrance, call method 
     eval("schCom1."+ fnName); 

Y a-t-il une substitution possible à cet appel eval?

Toute aide sera utile.

Merci d'avance.
Tazim.

+2

duplication possible de [Appel dynamique fonction avec paramètres dynamiques en Javascript] (http://stackoverflow.com/questions/676721/calling-dynamic -function-with-dynamic-parameters-in-javascript) –

+1

Vous devriez utiliser 'fnName + =" ("+ fnArgs.join (", ") +") "' à la place de cette boucle 'for'. – Ben

Répondre

3

Pourvu que fnName est vraiment un nom d'une méthode de l'objet schCom1:

schCom1[fnName].apply(schCom1,fnArgs); 

Fondamentalement, la méthode apply pour les objets de fonction vous permet d'appeler la fonction et de fournir le contexte (objet parent) et les arguments. Et la méthode apply s'attend à ce que les arguments de fonction soient fournis sous la forme d'un tableau, ce qui est utile dans ce cas.

Voir la documentation de la méthode apply pour plus d'informations:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply

il y a aussi la méthode call qui fait quelque chose de similaire, mais attend des arguments de fonction comme une liste d'arguments régulière:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/call

+0

merci beaucoup. réponse a été vraiment utile pour comprendre le concept – Star123

+0

fnName n'est pas le vrai nom du nom de la fonction de schCom1. fnName = Demande ("fnName"). il devrait être schCom1 [Request ("fnName")]. apply (schCom1, fnArgs); – Star123

2

Vous pouvez utiliser un plus simple

schCom1[fname].apply(schCom1, fnArgs) 

qui remplacerait tout votre code là

+1

Vous ne voulez pas dire 'schCom1 [fnName] .apply'? A part ça, bonne réponse :) – Aistina

+1

@Aistina oui je l'ai fait, merci! (n'a pas vu le point sanglant là) –

+1

'ceci' pointe probablement vers une variable globale dans ce contexte, il devrait vraiment être' schCom1' à la place – Andris