给定一个描述Javascript函数的string,将其转换为Javascript函数

说我有一个像下面这样的Javascriptstring

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

(这可能来自用户input的expression式,经过适当的消毒处理,也可能是一些符号计算的结果,这并不重要)。

我想定义fn ,就好像下面这行代码在我的代码中一样:

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

我怎么做?

我想到的最好的是以下几点:

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

这似乎是伎俩,即使它使用了可怕的eval() ,并使用了一个稍微复杂的参数。 我可以做得更好吗? 也就是说不使用eval() ,或者提供一个简单的参数?

还有Function对象。

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

你可以这样做:

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

不知道如何得到它更简单,有时候没有(更好)围绕eval() 。 这是一个很好的例子 。

使用括号。

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

这种技术也适用于传输JSON值。

顺便说一下,通过从其他函数直接编写函数来构build函数通常会更好。 如果你使用string,你不得不担心诸如意外的variables捕获 。

Function构造函数创build一个新的Function对象。 在JavaScript中,每个函数实际上都是一个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 

您还可以将string插入到脚本元素中,然后将脚本元素插入到页面中。

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

单程:

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

第二个更安全的方式来将string转换为函数:

  // 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); } 

看工作代码http://plnkr.co/edit/OiQAVd9DMV2PfK0NG9vk

你可以调用parsing你的string作为JavaScript的function

  1. function getDate(){alert('done')} //假设这是你定义的函数

调用上面的函数getDate()是这样的string格式,如“getDate()”

  1. var callFunc=new Function('getDate()') //parsing并注册你的函数

  2. callFunc() //调用函数

以下是我用于简单情况的内容:

 // 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());