177 votos

¿Cómo convertir una cadena en una llamada a función javascript?

Tengo una cadena como:

settings.functionName + '(' + t.parentNode.id + ')';

que quiero que se traducen en una llamada a una función así:

clickedOnItem(IdofParent);

Por supuesto esto tendrá que hacerse en javascript. Cuando hago una alerta en settings.functionName + '(' + t.parentNode.id + ')'; parece todo correcto. Sólo tengo que llamar a la función que traducirían en.

Leyenda:

settings.functionName = clickedOnItem

t.parentNode.id = IdofParent

247voto

PatrikAkerstrand Puntos 23968

Viendo como odio a eval, y I am not alone:

var fn = window[settings.functionName];
if(typeof fn === 'function') {
    fn(t.parentNode.id);
}

Edit: En respuesta a @Mahan comentario: En este caso particular, settings.functionName estaría "clickedOnItem". Este sería, en tiempo de ejecución traducir var fn = window[settings.functionName]; a var fn = window["clickedOnItem"], lo que permitiría obtener una referencia a function clickedOnItem (nodeId) {}. Una vez que tenemos una referencia a una función de una variable, podemos llamar a esta función por "llamar a la variable", es decir. fn(t.parentNode.id), lo que equivale clickedOnItem(t.parentNode.id), que era lo que el OP quería.

Más completo ejemplo:

/* Somewhere: */
window.settings = {
  /* [..] Other settings */
  functionName: 'clickedOnItem'
  /* , [..] More settings */
};

/* Later */
function clickedOnItem (nodeId) {
  /* Some cool event handling code here */
}

/* Even later */
var fn = window[settings.functionName]; 
/* note that settings.functionName could also be written
   as window.settings.functionName. In this case, we use the fact that window
   is the implied scope of global variables. */
if(typeof fn === 'function') {
    fn(t.parentNode.id);
}

51voto

Fabien Ménager Puntos 45472
window[settings.functionName](t.parentNode.id);

No hay necesidad de un eval()

49voto

NGauthier Puntos 446

Aquí está una forma más genérica para hacer lo mismo, apoyando a los ámbitos:

// Get function from string, with or without scopes (by Nicolas Gauthier)
window.getFunctionFromString = function(string)
{
    var scope = window;
    var scopeSplit = string.split('.');
    for (i = 0; i < scopeSplit.length - 1; i++)
    {
        scope = scope[scopeSplit[i]];

        if (scope == undefined) return;
    }

    return scope[scopeSplit[scopeSplit.length - 1]];
}

Esperanza puede ayudar a algunas personas hacia fuera.

10voto

Andrew Hare Puntos 159332

JavaScript tiene un eval que evalúa una cadena y se ejecuta como código de función:

eval(settings.functionName + '(' + t.parentNode.id + ')');

9voto

Jesse Millikan Puntos 2265

eval() es la función que usted necesita para hacer eso, pero te aconsejo probar una de estas cosas para minimizar el uso de eval. Esperemos que uno de ellos tenga sentido para usted.

Función como valor de la función:

Si es posible, guardar la función como una función, no como una cadena, y usar de esa forma posterior. Donde realmente almacén de la función.

var funcForLater = clickedOnItem;

// later is now
funcForLater(t.parentNode.id);

o

someObject.funcForLater = clickedOnItem;    
// later is now    
(someObject.funcForLater)(t.parentNode.id);

Nombre de la función como de la cadena de valor:

Incluso si usted tiene que guardar el nombre de la función como una cadena, usted puede minimizar la complejidad haciendo

(eval(settings.functionName))(t.parentNode.id);

lo que disminuye la cantidad de Javascript que se tiene que construir y eval.

Diccionario de los controladores:

Poner toda la acción de funciones que pueda necesitar en un objeto, y llamar a ellos de estilo diccionario utilizando la cadena.

// global
itemActions = { click: clickedOnItem, rightClick: rightClickedOnItem /* etc */ };

// Later...
var action = "click"; // Or wherever you got the action name
(itemActions[action])(t.parentNode.id);

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X