2010-07-29 3 views
4

Par souci de simplicité, j'ai inclus un script qui appelle dynamiquement une fonction par son nom:nommant Dynamiquement et la mise en œuvre du corps d'une fonction javascript

var foo = "hello"; 
var bar = "world"; 
var function_name = "say_" + foo + bar; 

// Since its name is being dynamically generated, always ensure your function actually exists 
if (typeof(window[function_name]) === "function") 
{ 
    window[function_name](" World!"); 
} 
else 
{ 
    throw("Error. Function " + function_name + " does not exist."); 
} 

function say_helloworld(the_word) 
{ 
    alert("Hello " + the_word); 
} 

Mais le code de la fonction say_helloworld est écrit dans un mode statique. Je voudrais quelque chose comme:

var function_implementation = 'function say_'+foo+bar+ 
    '(the_world){alert("Hello " + the_world);}'; 
eval(function_implementation); 

mais sans utiliser eval(). Il y a une approche encore plus laide: faire un appel AJAX pour obtenir la fonction.

Pouvez-vous voir une meilleure approche?

Répondre

5

Vous pouvez utiliser une expression de fonction en ligne:

window['say_'+foo+bar]= function(the_world) { 
    alert('Hello '+the_world); 
}; 

Cependant, il n'y a presque jamais une bonne raison d'utiliser des variables dynamiquement nommées. fonctions Stocker dans un objet de recherche distincte à la place:

var says= { 
    helloworld: function(the_world) { 
     alert('Hello '+the_world); 
    }, 
    somethingelse: function(otherthing) { 
     alert('Something else with '+otherthing); 
    } 
}; 
says[somevar]('potatoes'); 
+0

excellente réponse, merci! –

1

Si vous voulez générer votre fonction dynamique sans eval vous pouvez utiliser le constructeur

Function([arg1[, arg2[, ... argN]],] functionBody) 

De cette façon, vous pouvez faire des choses comme

var func = new Function('message', 'alert("Hello, " + message);') 
func('world!'); 

Voir MDC pour plus d'instructions.

Vive

Remarque: Je n'ai jamais utilisé cette approche avant et je ne jamais utiliser le constructeur Function() avant. Donc je ne sais pas si cela pourrait avoir d'autres inconvénients.

+0

intéressant, fonctionne-t-il avec d'autres moteurs de rendu? –

+1

@altvali Il est inclus dans la 3ème édition ECMA-262 (http://www.ecma-international.org/publications/standards/ecma-262.htm) qui est la base de Javascript 1.5. Selon Wikipedia (http://en.wikipedia.org/wiki/JavaScript#Versions), même IE5.5 devrait comprendre cela. – moxn

1

Vous pouvez utiliser un délai d'attente qui interprétera votre code, mais il pourrait utiliser le eval interne donc pas sûr si vous voulez que cela ..

fText = 'function test(a){alert(a);}'; 
setTimeout(fText,0); 

mais vous devez laisser quelques millisecondes avant d'invoquer ce ..