2009-11-12 6 views
116

J'ai une variable JavaScript qui contient le nom d'une fonction JavaScript. Cette fonction existe sur la page en ayant été chargée et placée en utilisant $ .ajax, etc.Appel d'une fonction JavaScript nommée dans une variable

Quelqu'un peut-il me dire comment j'appellerais la fonction javascript nommée dans la variable, s'il vous plaît?

Le nom de la fonction est dans une variable car l'URL utilisée pour charger le fragment de page (qui est inséré dans la page en cours) contient le nom de la fonction à appeler.

Je suis ouvert à d'autres suggestions sur la façon de mettre en œuvre cette solution.

+7

Cela a été demandé sur 18 fois avant sur SO. * S'il vous plaît * rechercher. –

+0

ressemble plus à un rappel ... est-ce? – Perpetualcoder

+2

@Crescent Fresh, FWIW, je ne vois rien dans la barre latérale associée qui semble pertinente. –

Répondre

215

J'éviterais eval.

Pour résoudre ce problème, vous devez savoir ces choses sur JavaScript.

  1. fonctions sont des objets de première classe, de sorte qu'ils peuvent être des propriétés d'un objet (auquel cas ils sont appelés méthodes) ou même des éléments de tableaux.
  2. Si vous ne choisissez pas l'objet auquel une fonction appartient, elle appartient à la portée globale. Dans le navigateur, cela signifie que vous le suspendez sur l'objet nommé "window", qui est l'endroit où vivent les globals.
  3. Les tableaux et les objets sont intimement liés. (La rumeur est qu'ils pourraient même être le résultat de l'inceste!) Vous pouvez souvent remplacer en utilisant un point . plutôt que les crochets [], ou vice versa.

Votre problème est dû au fait que nous considérons la méthode de référence par points plutôt que la méthode des crochets.

Alors, pourquoi ne pas quelque chose comme,

window["functionName"](); 

C'est en supposant que votre fonction vit dans l'espace mondial. Si vous avez d'espace de nom, puis:

myNameSpace["functionName"](); 

Évitez eval et éviter de passer une chaîne pour setTimeout et setInterval. J'écris beaucoup de JS, et je n'ai JAMAIS besoin d'évaluation. "Avoir besoin" eval vient de ne pas connaître la langue assez profondément. Vous devez en apprendre davantage sur la portée, le contexte et la syntaxe. Si vous êtes toujours coincé avec un test, posez simplement la question - vous apprendrez rapidement.

+0

Il est une bonne idée –

+3

... et si vous allez faire quelque chose comme ça, vous devriez probablement vos fonctions définies en tant que membres d'un objet. – Quentin

+1

Je suis d'accord, 'eval()' devrait être évité dans ce cas, pour éviter les problèmes XSS. – pkaeding

4

C'est un peu moche, mais c'est la première chose qui a surgi dans ma tête. Cela devrait également vous permettre de transmettre des arguments:

eval('var myfunc = ' + variable); myfunc(args, ...); 

Si vous n'avez pas besoin de passer des arguments, cela pourrait être plus simple.

eval(variable + '();'); 

L'avertissement standard de code sec s'applique.

+0

c'était bon et a résolu le problème de mine, mais est-ce bien d'utiliser eval? – nirmal

+1

Pourquoi cela ne serait-il pas sécuritaire? Eval est diabolique seulement quand vous lui passez l'entrée de l'utilisateur. Comme avoir un côté serveur func eval qui accepte les données du client comme argument – avalanche1

50

si ce dernier est dans la portée globale ESt mieux utiliser:

function foo() 
{ 
    alert('foo'); 
} 

var a = 'foo'; 
window[a](); 

que eval(). Parce que eval() est evaaaaaal.

Exactement comme Nosredna dit 40 secondes devant moi qui est>. <

+0

Je vois qu'on se ressemble. :-) – Nosredna

+0

Ouais, upvoted votre réponse en toute équité entre vous me battre;) – anddoutoi

+20

upvoted vôtre parce que je suis un enfer d'un gars sympa. – Nosredna

19

Évitez absolument d'utiliser eval pour faire quelque chose comme ceci, ou vous vous ouvrirez aux vulnérabilités de XSS (Cross-Site Scripting).

Par exemple, si vous deviez utiliser les eval solutions proposées ici, un utilisateur malfaisant pourrait envoyer un lien vers leur victime qui ressemblait à ceci:

http://yoursite.com/foo.html?func=function() {alert (« Im% 20Dans% 20Teh% 20Codez »);}

Et leur javascript, pas le vôtre, serait exécuté. Ce code pourrait faire quelque chose de bien pire que simplement faire apparaître une alerte bien sûr; Donc, assurez-vous de ne jamais eval code non approuvé qui vient de l'entrée de l'utilisateur (et tout ce qui figure sur l'ID de la chaîne de requête est considéré comme une entrée de l'utilisateur). Vous pouvez prendre l'entrée de l'utilisateur comme une clé qui pointera sur votre fonction, mais assurez-vous de ne rien exécuter si la chaîne donnée ne correspond pas à une clé de votre objet. Par exemple:

// set up the possible functions: 
var myFuncs = { 
    func1: function() { alert('Function 1'); }, 
    func2: function() { alert('Function 2'); }, 
    func3: function() { alert('Function 3'); }, 
    func4: function() { alert('Function 4'); }, 
    func5: function() { alert('Function 5'); } 
}; 
// execute the one specified in the 'funcToRun' variable: 
myFuncs[funcToRun](); 

Cela échouera si la variable funcToRun ne pointe pas à quoi que ce soit dans l'objet myFuncs, mais il ne signera pas un code.

+0

Merci. Bien que peut-être pas exactement ce dont l'utilisateur avait besoin, c'est exactement ce dont j'avais besoin. J'ai oublié mon() lors de l'appel de ma fonction. – cepatt

+0

Idéal pour les applications de nœud! Merci! – THpubs

Questions connexes