web-dev-qa-db-fra.com

Appeler une fonction JavaScript nommée dans une variable

J'ai une variable JavaScript qui contient le nom d'une fonction JavaScript. Cette fonction existe sur la page après avoir été chargée et placée avec $ .ajax, etc.

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 manière de mettre en œuvre cette solution.

141
Matt W

J'éviterais eval.

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

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

Votre problème découle de l’examen de la méthode de point de référence plutôt que de la méthode des crochets.

Alors, pourquoi pas quelque chose comme,

_window["functionName"]();
_

Cela suppose que votre fonction réside dans l'espace mondial. Si vous avez un espace de noms, alors:

_myNameSpace["functionName"]();
_

Évitez eval et évitez de transmettre une chaîne à setTimeout et setInterval. J'écris beaucoup de JS et je n'ai JAMAIS besoin d'évaluation. "Needing" eval vient du fait de ne pas connaître suffisamment la langue. Vous devez en apprendre davantage sur la portée, le contexte et la syntaxe. Si vous vous retrouvez coincé avec un eval, il vous suffit de demander: vous apprendrez rapidement.

246
Nosredna

Si c'est dans le champ global, il est préférable d'utiliser:

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

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

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

Exactement comme Nosredna a dit 40 secondes devant moi, c'est-à-dire>. <

61
anddoutoi

Évitez définitivement d'utiliser eval pour faire quelque chose comme cela, sinon vous vous exposeriez aux vulnérabilités XSS (Cross-Site Scripting).

Par exemple, si vous utilisiez les solutions eval proposées ici, un utilisateur néfaste pourrait envoyer à sa victime un lien qui ressemblerait à ceci:

http://votresite.com/foo.html?func=function () {alert ('Im% 20In% 20Teh% 20Codez');}

Et leur javascript, pas le vôtre, serait exécuté. Ce code pourrait faire quelque chose de bien pire que de simplement afficher une alerte; il pourrait voler des cookies, envoyer des demandes à votre application, etc.

Donc, assurez-vous de ne jamais eval code non fiable qui provient d'une entrée utilisateur (et de tout élément de l'ID de la chaîne de requête considéré comme une entrée utilisateur). Vous pouvez considérer l'entrée utilisateur comme une clé qui pointe vers 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 vers rien dans l'objet myFuncs, mais n'exécutera aucun code.

22
pkaeding

C’est un peu moche, mais c’est la première chose qui m’est venue à l’esprit. Cela devrait également vous permettre de passer des arguments:

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

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

eval(variable + '();');

L'avertissement standard de code à sec s'applique.

5
Bryan McLemore