2009-07-17 7 views

Répondre

26

Cela me semble bien. Je serais probablement créer une fonction simple d'aide comme suit:

function runFunction(name, arguments) 
{ 
    var fn = window[name]; 
    if(typeof fn !== 'function') 
     return; 

    fn.apply(window, arguments); 
} 

//If you have following function 

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

//You can call it like 

runFunction('foo', ['test']); //alerts test. 
+0

+1, me battre et a eu une meilleure fonction d'appelant. – tj111

+0

Bonne réponse. Je pense qu'avoir un assistant qui vérifie la santé mentale est une bonne idée. –

+2

À quelle fréquence appelleriez-vous une fonction déclarée à l'étendue globale et lui donneriez-vous un contexte autre que null? (btw je pense que votre utilisation du mot portée est trompeuse, le contexte serait meilleur) – AnthonyWJones

1

Vous pouvez utiliser eval (str)

eval('foo();'); 

utiliser avec une extrême prudence.

+1

-1. Il n'y a pas besoin d'utiliser eval ici. – SolutionYogi

+0

Ai-je bien compris la question? Pourquoi eval est-il faux? – Gee

+0

En utilisant eval, vous appelez l'analyseur syntaxique Javascript et Dieu sait ce qu'il faut d'autre pour prendre du texte et le transformer en un ensemble d'instructions qui peuvent être exécutées. window ['foo']() fonctionne donc eval devrait être évité dans ce cas – AnthonyWJones

6

Personnellement, je pas pris la peine, même avec une fonction d'aide

window[someKey]('test') 

serait bien.

Cependant, je ne conserverais pas un ensemble de fonctions possibles à appeler à l'échelle globale de toute façon. Par conséquent, j'utiliser un modèle plus général: -

obj[someKey]('test') 

où obj peut être this, une propriété de ce à partir d'une fermeture ou variable.

1

Vous pouvez simplement l'utiliser comme ça ... (de remplacer les cours chaînes avec des variables en cas de besoin)

document["getElementById"]("elementName")["style"]["border"] = "1PX SOLID GREEN"; 

Ce qui est facilement/habituellement typé comme celui-ci bien sûr ...

document.getElementById("elementName").style.border = "1PX SOLID GREEN"; 

Voici un autre exemple à plusieurs dimensions ...

var myObject = new Object(); 
myObject["myValue"]["one"] = "first value"; 
myObject["myValue"]["two"] = "second value"; 
alert(myObject["myValue"]["two"]); //outputs "second value" 

qui pourrait aussi être écrit ...

var myObject = new Object(); 
myObject["myValue"] = {one: "first value", two: "second value"}; 
alert(myObject["myValue"]["two"]); //outputs "second value" 
0

J'ai créé une fonction pour appeler une fonction nommée. Il fonctionne à la fois dans le navigateur et dans Node.js. J'ai créé une substance (https://gist.github.com/netsi1964/3f19bd96f2d6e18bd818) qui contient également un petit test. L'empreinte de la fonction est: callFunction(scope, fn, args). Il définit l'étendue de la fonction sur la portée spécifiée et par défaut window (dans le navigateur) et global (dans Node.js). Pour répondre à votre demande initiale, vous devez l'utiliser comme suit: callFunction(window, "foo",["test"])

Questions connexes