C’è un modo per creare una funzione da una stringa con javascript?

Per esempio;

var s = "function test(){ alert(1); }"; var fnc = aMethod(s); 

Se questa è la stringa, voglio una funzione che si chiama fnc. E fnc(); apre la schermata di avviso.

eval("alert(1);") risolve il mio problema.

Ho aggiunto un test jsperf per 4 modi diversi per creare una funzione dalla stringa:

  • Utilizzo di RegExp con la class Function

    var func = "function (a, b) { return a + b; }".parseFunction();

  • Utilizzo della class Function con “return”

    var func = new Function("return " + "function (a, b) { return a + b; }")();

  • Utilizzando il costruttore di funzioni ufficiali

    var func = new Function("a", "b", "return a + b;");

  • Usando Eval

    eval("var func = function (a, b) { return a + b; };");

http://jsben.ch/D2xTG

2 campioni di risultati: inserisci la descrizione dell'immagine qui inserisci la descrizione dell'immagine qui

Un modo migliore per creare una funzione da una stringa è utilizzando la Function :

 var fn = Function("alert('hello there')"); fn(); 

Ciò ha come vantaggio / svantaggio che le variabili nell’ambito corrente (se non globali) non si applicano alla funzione appena costruita.

È ansible anche passare argomenti:

 var addition = Function("a", "b", "return a + b;"); alert(addition(5, 3)); // shows '8' 

Sei molto vicino.

 //Create string representation of function var s = "function test(){ alert(1); }"; //"Register" the function eval(s); //Call the function test(); 

Ecco un violino funzionante .

Sì, usare Function è un’ottima soluzione, ma possiamo andare un po ‘oltre e preparare un parser universale che analizzi la stringa e la converta in una vera funzione JavaScript …

 if (typeof String.prototype.parseFunction != 'function') { String.prototype.parseFunction = function () { var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi; var match = funcReg.exec(this.replace(/\n/g, ' ')); if(match) { return new Function(match[1].split(','), match[2]); } return null; }; } 

esempi di utilizzo:

 var func = 'function (a, b) { return a + b; }'.parseFunction(); alert(func(3,4)); func = 'function (a, b) { alert("Hello from function initiated from string!"); }'.parseFunction(); func(); 

ecco jsfiddle

Nomi di funzioni dinamiche in JavaScript

Utilizzando la Function

 var name = "foo"; // Implement it var func = new Function("return function " + name + "(){ alert('hi there!'); };")(); // Test it func(); // Next is TRUE func.name === 'foo' 

Fonte: http://marcosc.com/2012/03/dynamic-function-names-in-javascript/

Usando eval

 var name = "foo"; // Implement it eval("function " + name + "() { alert('Foo'); };"); // Test it foo(); // Next is TRUE foo.name === 'foo' 

Utilizzando sjsClass

https://github.com/reduardo7/sjsClass

Esempio

 Class.extend('newClassName', { __constructor: function() { // ... } }); var x = new newClassName(); // Next is TRUE newClassName.name === 'newClassName' 

Questa tecnica potrebbe essere in definitiva equivalente al metodo eval, ma volevo aggiungerla, perché potrebbe essere utile per alcuni.

 var newCode = document.createElement("script"); newCode.text = "function newFun( a, b ) { return a + b; }"; document.body.appendChild( newCode ); 

Funzionalmente è come aggiungere questo elemento

 ...    

Usa la new Function() con un ritorno dentro e eseguilo immediatamente.

 var s = `function test(){ alert(1); }`; var new_fn = new Function("return " + s)() console.log(new_fn) new_fn() 

Un esempio con argomenti dinamici:

 let args = {a:1, b:2} , fnString = 'return a + b;'; let fn = Function.apply(Function, Object.keys(args).concat(fnString)); let result = fn.apply(fn, Object.keys(args).map(key=>args[key]))