50 votes

Appeler un nom de fonction JavaScript en utilisant une chaîne?

Comment puis-je associer un événement à un nom de fonction que j'ai défini en tant que chaîne?

J'utilise Prototype.js, bien qu'il ne s'agisse pas de Prototype-speficic.

 $(inputId).observe('click', formData.fields[x].onclick);
 

Cela aurait pour conséquence que JavaScript se plaint que mon gestionnaire n'est pas une fonction. Je préférerais ne pas utiliser eval() .

87voto

Greg Points 132247

Si la fonction est dans la portée globale, vous pouvez l'obtenir en utilisant l'objet window:

 var myFunc = window[myFuncName];
 

9voto

Ikon Points 377

J'ai travaillé sur ce problème, car j'avais besoin d'une fonction comme celle-ci. Voici mon code sandbox, non testé de manière approfondie, mais qui peut constituer un point de départ pour d’autres. Notez qu'il y a un eval () dans le code car je ne pouvais pas comprendre comment contourner cette étape, peut-être une erreur javascript et ne peut pas être réalisée autrement. Faites-moi savoir s'il existe un moyen de vous débarrasser de eval () ici!

 executeFunctionByName = function(functionName)
{
    var args = Array.prototype.slice.call(arguments).splice(1);
    //debug
    console.log('args:', args);

    var namespaces = functionName.split(".");
    //debug
    console.log('namespaces:', namespaces);

    var func = namespaces.pop();
    //debug
    console.log('func:', func);

    ns = namespaces.join('.');
    //debug
    console.log('namespace:', ns);

    if(ns == '')
    {
        ns = 'window';
    }

    ns = eval(ns);
    //debug
    console.log('evaled namespace:', ns);

    return ns[func].apply(ns, args);
}


core = {
    paragraph: {
        titlebar: {
            user: "ddd",
            getUser: function(name)
            {
                this.user = name;
                return this.user;
            }
        }
    }
}

var testf = function()
{
    alert('dkdkdkd');
}

var x = executeFunctionByName('core.paragraph.titlebar.getUser', 'Ikon');
executeFunctionByName('testf');
 

8voto

le dorfier Points 27267

... ou ce [myFuncName];

4voto

Anthony Scaife Points 175

Peut-être?

 setTimeout ( "myFunc()", 1 );
 

3voto

geowa4 Points 17712
window.myFunction === window["myFunction"]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X