2010-12-13 8 views
0

s'il vous plaît aider J'ai un exemple simple ici fonction de rappel JavaScript

<script type="text/javascript" language="javascript"> 
    function test(callback1) { 
     callback1(); 
    } 
    var f1 = function() { 
     alert(1); 
    } 
</script> 

Actuellement, le paramètre de la fonction de test est une fonction, lorsque le bouton abc est cliqué, la fonction de test sera appelé et test appel f1. Tout va bien avec moi.

Cependant, je voudrais un petit changement comme ceci: le paramètre de la fonction de test sera une chaîne, je veux dire que ce devrait être un nom de fonction, test ('f1') au lieu de test (f1). Est-ce possible? Comment puis-je l'implémenter?

Merci

+0

duplication possible de [nom de la fonction JavaScript sous forme de chaîne ...] (http://stackoverflow.com/questions/359788/javascript-function-name-as-a-string) – epascarello

Répondre

2

window[callback1]();

Selon l'utilisation que je préférerais préparer carte séparée des fonctions.

var funcMap = { 
    f1: function() {...}, 
    ... 
}; 
funcMap['f4'] = function() {...}; 
function test(callback1) { 
    funcMap[callback1](); 
} 

Il ne certainement pas ballonnement espace de noms window et est plus sûr (fenêtre a plus de méthodes fournies par le navigateur). Ne pas utiliser eval - c'est diabolique!

+0

merci gertas – khoailang

0

Vous pouvez utiliser eval() pour exécuter la fonction qui est passée comme une chaîne. Mais son déconseillé pour utiliser eval.

Exemple:

function test(someFunctionName) { 
     eval(someFunctionName); 
    } 
+1

eval est diabolique :) – epascarello

+0

@ epascarello: Je ne l'ai jamais utilisé dans le code de production, donc je ne sais pas comment ça peut être mal. Mais, si beaucoup de gens sages l'ont essayé et le disent, alors je vais avec eux :) –

+0

si les gens disent sauter d'un pont parce que c'est le moyen le plus rapide de le faire? :) L'évaluation est lente, l'évaluation peut entraîner des problèmes de sécurité et il existe de meilleures solutions. – epascarello

0

écrire quelque chose comme

function test(callback1) { 
    eval(callback1 + "()"); 
} 

alors callback1 doit être une chaîne

+1

eval est le mal :) – epascarello

+0

Je sais. Mais le développeur pragmatique peut toujours préférer le mal à un autre 3h de recherche :) –

+1

programmeur pragmatique devrait également éduquer les adeptes en faisant des recherches, ce qui n'est pas si difficile ici. Eval est comme SQL paramétré par des chaînes concaténées. Je n'appellerais pas un programmeur en les utilisant. – gertas

2

eval() est inutile ici. Pour passer un rappel, il suffit de passer le nom de la fonction. Les fonctions sont des variables.

Par exemple:

function test(a){ 
    alert(a); 
} 

function callback(b,a){ 
    b(a); 
} 

callback(test, 'dog'); //alerts 'dog' 

Donc, dans votre code, test(f1) fonctionnera bien.