¿Cómo convertir una cadena en una llamada de función de JavaScript?



Answers

window[settings.functionName](t.parentNode.id);

No es necesario un eval ()

Question

Esta pregunta ya tiene una respuesta aquí:

Tengo un hilo como:

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

que quiero traducir en una llamada a función como esta:

clickedOnItem(IdofParent);

Esto, por supuesto, tendrá que hacerse en JavaScript. Cuando hago una alerta en settings.functionName + '(' + t.parentNode.id + ')'; parece que todo está correcto. Solo necesito llamar a la función a la que se traduciría.

Leyenda:

settings.functionName = clickedOnItem

t.parentNode.id = IdofParent



Quería poder tomar el nombre de una función como una cadena, llamarla Y pasarle un argumento a la función. No pude obtener la respuesta seleccionada para esta pregunta para hacer eso, pero esta answer explicó exactamente, y aquí hay una breve demostración.

function test_function(argument)    {
    alert('This function ' + argument); 
}

functionName = 'test_function';

window[functionName]('works!');

Esto también funciona con múltiples argumentos.




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

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



Basado en la respuesta de Nicolas Gauthier:

var strng = 'someobj.someCallback';
var data = 'someData';

var func = window;
var funcSplit = strng.split('.');
for(i = 0;i < funcSplit.length;i++){
   //We maybe can check typeof and break the bucle if typeof != function
   func = func[funcSplit[i]];
}
func(data);



En javascript que usa la especificación CommonJS, como node.js, por ejemplo, puede hacer lo que muestro a continuación. Lo cual es bastante útil para acceder a una variable mediante una cadena, incluso si no está definida en el objeto window . Si hay una clase llamada MyClass , definida dentro de un módulo CommonJS llamado MyClass.js

// MyClass.js
var MyClass = function() {
    // I do stuff in here. Probably return an object
    return {
       foo: "bar"
    }
}

module.exports = MyClass;

A continuación, puede hacer este buen bit de brujería desde otro archivo llamado MyOtherFile.js

// MyOtherFile.js

var myString = "MyClass";

var MyClass = require('./' + myString);
var obj = new MyClass();

console.log(obj.foo); // returns "bar"

Una razón más por la que CommonJS es un placer.




Si bien me gusta la primera respuesta y odio la evaluación, me gustaría añadir que hay otra forma (similar a eval) por lo que si puedes ir y no usarla, es mejor que lo hagas. Pero en algunos casos es posible que desee llamar a algún código de JavaScript antes o después de una llamada ajax y si tiene este código en un atributo personalizado en lugar de ajax puede usar esto:

    var executeBefore = $(el).attr("data-execute-before-ajax");
    if (executeBefore != "") {
        var fn = new Function(executeBefore);
        fn();
    }

O eventualmente almacenar esto en un caché de función si es necesario llamarlo varias veces.

Nuevamente, no use eval o este método si tiene otra manera de hacerlo.




Links