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

时间:2010-04-04 04:19:13

标签: javascript

说我有一个类似下面的Javascript字符串

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

(这可能来自用户输入的表达式,正确消毒,或者可能是某些符号计算的结果。这无关紧要。)

我想定义fn,好像我的代码中有以下行:

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

我该怎么做?

我想出的最好成绩如下:

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

这似乎可以解决问题,即使它使用了可怕的eval(),并且使用了一个稍微复杂的参数。我可以做得更好吗?即要么不使用eval(),要么提供更简单的参数?

8 个答案:

答案 0 :(得分:58)

还有Function对象。

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

答案 1 :(得分:25)

你可以这样做:

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

不确定如何更简单,有时候eval()没有(更好)的方法。这是一个quick example of this in action

答案 2 :(得分:11)

使用括号。

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

此技术也适用于传输JSON值。

顺便说一句,通过直接从其他函数编写函数来构建函数通常更好。如果您使用字符串,则必须担心意外variable capture等内容。

答案 3 :(得分:4)

这是我用于简单案例的内容:

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

答案 4 :(得分:3)

Function 构造函数创建一个新的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

答案 5 :(得分:3)

您还可以将字符串插入脚本元素,然后将脚本元素插入页面。

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

答案 6 :(得分:2)

单步:

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

将字符串转换为函数的第二种更安全的方法:

     // 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

答案 7 :(得分:2)

您可以将您的字符串解析为javascript fuction

  1. function getDate(){alert('done')} //假设这是您定义的函数
  2. 调用以上函数 getDate()这是字符串格式,如 'getDate()'

    1. var callFunc=new Function('getDate()') //解析并注册您的功能

    2. callFunc() //调用函数