2009-07-17 12 views

Respuesta

26

Me parece bien. Yo probablemente crear una función auxiliar sencillo como lo siguiente:

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 ganó y tenía una mejor función de llamada. – tj111

+0

Buena respuesta. Creo que tener una ayuda que haga algunas verificaciones de cordura es una gran idea. –

+2

¿Con qué frecuencia llamaría a una función declarada en el ámbito global y le daría un contexto que no sea nulo? (Por cierto, creo que el uso del alcance de la palabra es engañoso, el contexto sería mejor) – AnthonyWJones

1

Puede utilizar eval (str)

eval('foo();'); 

uso esto con extrema precaución.

+1

-1. No hay necesidad de usar eval aquí. – SolutionYogi

+0

¿Entendí mal la pregunta? ¿Por qué eval eval es incorrecto? – Gee

+0

Al usar eval se invoca el analizador de Javascript y se sabe qué más se necesita para tomar el texto y convertirlo en un conjunto de instrucciones que se pueden ejecutar. window ['foo']() funciona así que eval debe evitarse en este caso – AnthonyWJones

6

personalmente no me molestaría incluso con una función de ayuda

window[someKey]('test') 

estaría bien.

Sin embargo, en general no mantendría un conjunto de posibles funciones para llamar al alcance global. Por lo tanto me gustaría utilizar un patrón más general: -

obj[someKey]('test') 

donde obj puede ser this, una propiedad de este o variable de un cierre.

1

Simplemente puede utilizar de esta manera ... (por supuesto sustituir las cadenas con variables cuando sea necesario)

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

Cuál es también de fácil/usualmente escrito como esto, por supuesto ...

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

Aquí hay otro ejemplo multidimensional-...

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

que también podría ser escrito como ...

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

He creado una función para llamar a una función con nombre. Funciona tanto en el navegador como en Node.js. He creado un gist (https://gist.github.com/netsi1964/3f19bd96f2d6e18bd818) que también contiene una pequeña prueba. La huella digital de la función es: callFunction(scope, fn, args). Establece el alcance de la función en el alcance especificado y se establece de manera predeterminada en window (en el navegador) y global (en Node.js). Para responder a su solicitud original lo usaría así: callFunction(window, "foo",["test"])

Cuestiones relacionadas