Dada uma string descrevendo uma function Javascript, converta-a para uma function Javascript

Digamos que eu tenha uma string de Javascript como a seguinte

var fnStr = "function(){blah1;blah2;blah3; }" ; 

(Isso pode ser de uma expressão que o usuário digitou, devidamente higienizado, ou pode ser o resultado de alguma computação simbólica. Realmente não importa).

Eu quero definir fn como se a seguinte linha estivesse no meu código:

 var fn = function(){blah1;blah2;blah3; } ; 

Como faço isso?

O melhor que eu encontrei é o seguinte:

 var fn = eval("var f = function(){ return "+fnStr+";}; f() ;") ; 

Isto parece fazer o truque, apesar de usar o temido eval() , e usa um argumento ligeiramente complicado. Posso fazer melhor? Ou seja, não use eval() ou forneça um argumento mais simples?

Há também o object Function .

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

Você consegue fazer isso:

 //in your case: eval("var fn = " + fnStr); eval("var fn = function(){ blah1;blah2;blah3; }"); fn(); 

Não tenho certeza de como fazê-lo muito mais simples, às vezes não há (melhor) maneira de eval() . Aqui está um exemplo rápido disso em ação .

Use parênteses.

 var fn = eval("(function() {...})"); 

Essa técnica também é boa para transmitir valores JSON.

A propósito, muitas vezes é melhor criar funções compondo-as diretamente de outras funções. Se você estiver usando strings, terá que se preocupar com coisas como a captura inesperada de variables .

O construtor Function cria um novo object Function. Em JavaScript, cada function é, na verdade, um object Function.

 // Create a function that takes two arguments and returns the sum of those arguments var fun = new Function("a", "b", "return a + b"); // Call the function fun(2, 6); Output: 8 

Você também pode inserir a sequência em um elemento de script e inserir o elemento de script na página.

 script_ele = window.document.createElement("script"); script_ele.innerHTML = 'function my_function(){alert("hi!");}'; window.document.body.appendChild(script_ele); my_function(); 

mão única:

  var a = 'function f(){ alert(111); } function d(){ alert(222);}'; eval(a); d(); 

segunda maneira mais segura de converter string em uma funciton:

  // function name and parameters to pass var fnstring = "runMe"; var fnparams = ["aaa", "bbbb", "ccc"]; // find object var fn = window[fnstring]; // is object a function? if (typeof fn === "function") fn.apply(null, fnparams); function runMe(a,b){ alert(b); } 

olha código de trabalho http://plnkr.co/edit/OiQAVd9DMV2PfK0NG9vk

Você pode chamar Parse sua string como function de javascript

  1. function getDate(){alert('done')} // suponha que esta seja sua function definida

chamar acima da function getDate () é isso no formato de string como ‘getDate ()’

  1. var callFunc=new Function('getDate()') // Analisa e registra sua function

  2. callFunc() // Chame a function

Aqui está o que eu uso para casos simples:

 // an example function function plus(...args) { return args.reduce( (s,v) => s+v, 0 ); } // function to string let str = plus.toString(); // string to function let copy = new Function('return ' + str)(); // tests console.assert(plus.name == 'plus'); console.assert(copy.name == 'plus'); console.assert(plus.constructor == Function); console.assert(copy.constructor == Function); console.assert(plus(1,2,3,4) === copy(1,2,3,4)); console.assert(plus.toString() === copy.toString());