有没有一种方法来创build一个string与JavaScript的function?

例如;

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

如果这是string,我想要一个叫做fnc的函数。 和fnc(); popup警报屏幕。

eval("alert(1);")不能解决我的问题。

从string创build函数的更好方法是使用Function

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

这具有与当前范围(如果不是全局的)中的variables不适用于新构build的function一样的优点/缺点。

传递参数也是可能的:

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

你很近

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

这是一个工作小提琴 。

我添加了一个jsperftesting4种不同的方式来从string创build一个函数:

  • 使用RegExp和Function类

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

  • 使用Function类与“返回”

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

  • 使用官方的函数构造函数

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

  • 使用Eval

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

http://jsben.ch/#/D2xTG

2个结果样本: 在这里输入图像描述 在这里输入图像描述

JavaScriptdynamic函数名称

使用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' 

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

使用eval

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

使用sjsClass

https://github.com/reduardo7/sjsClass

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

是的,使用Function是一个很好的解决scheme,但我们可以进一步,并准备通用parsing器parsingstring,并将其转换为真正的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; }; } 

用法示例:

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

这里是jsfiddle

这种技术可能最终等同于eval方法,但我想添加它,因为它可能对一些有用。

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

这在function上就像将<script>元素添加到文档的末尾,例如:

 ... <script type="text/javascript"> function newFun( a, b ) { return a + b; } </script> </body> </html> 

一个dynamic参数的例子:

 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]))