0 votes

Appeler une fonction par une chaîne de caractères en JavaScript et rester dans le champ d'application de la fonction

J'ai joué et cherché un peu, mais je n'arrive pas à comprendre. J'ai une fonction pseudo privée dans un objet JavaScript qui doit être appelée via eval (parce que le nom de la fonction est construit dynamiquement). Cependant, la fonction est cachée de la portée globale par une fermeture et je n'arrive pas à trouver comment la référencer en utilisant eval().

Ex :

var myObject = function(){
    var privateFunctionNeedsToBeCalled = function() {
        alert('gets here');
    };

    return {
        publicFunction: function(firstPart, SecondPart) {
            var functionCallString = firstPart + secondPart + '()';
            eval(functionCallString);
        }
    }
}();

myObject.publicFunction('privateFunctionNeeds', 'ToBeCalled');

Je sais que l'exemple a l'air stupide mais je voulais rester simple. Des idées ?

5voto

moonshadow Points 28302

La chaîne passée à eval() est évalué dans la portée de cette eval(), donc vous pourriez faire

    return {
        publicFunction: function(firstPart, SecondPart) {
            var captured_privateFunctionNeedsToBeCalled = privateFunctionNeedsToBeCalled;
            var functionCallString = 'captured_' + firstPart + secondPart + '()';
            eval(functionCallString);
        }
    }

Cependant, une meilleure solution serait d'éviter complètement l'utilisation de eval() :

var myObject = function(){
    var functions = {};
    functions['privateFunctionNeedsToBeCalled'] = function() {
        alert('gets here');
    };

    return {
        publicFunction: function(firstPart, secondPart) {
            functions[firstPart+secondPart]();
        }
    }
}();

myObject.publicFunction('privateFunctionNeeds', 'ToBeCalled');

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