代码之家  ›  专栏  ›  技术社区  ›  brainjam

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

  •  40
  • brainjam  · 技术社区  · 15 年前

    假设我有一个javascript字符串,如下所示

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

    (这可能来自用户键入的表达式,经过适当的清理,也可能是某些符号计算的结果。这真的没关系)。

    我想定义 fn 好像我的代码中有下面一行:

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

    我该怎么做?

    我想到的最好的办法是:

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

    这似乎起到了作用,尽管它使用了可怕的 eval() ,并使用稍微复杂的参数。我能做得更好吗?也就是说要么不用 表达式() ,或者提供一个更简单的论点?

    8 回复  |  直到 15 年前
        1
  •  55
  •   goat    12 年前

    还有 Function 对象。

    var adder = new Function("a", "b", "return a + b");
    
        2
  •  25
  •   Nick Craver    15 年前

    你可以这样做:

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

    不知道如何使它简单得多,有时没有更好的方法 eval() . 这里有一个 quick example of this in action .

        3
  •  11
  •   nhahtdh Pankaj Wadhwa    11 年前

    使用括号。

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

    这种技术对于传输json值也很有用。

    顺便说一下,通过直接从其他函数组合函数来构建函数通常更好。如果你在使用字符串,你必须担心一些意想不到的事情 variable capture .

        4
  •  3
  •   SK.    11 年前

    这个 Function 构造函数创建新的函数对象。在javascript中,每个函数实际上都是一个函数对象。

    // 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
  •   user984003    8 年前

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

    script_ele = window.document.createElement("script");
    script_ele.innerHTML = 'function my_function(){alert("hi!");}';
    window.document.body.appendChild(script_ele);
    my_function();
    
        6
  •  3
  •   Julian TF    8 年前

    以下是我在简单案例中使用的方法:

    // 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());
    
        7
  •  2
  •   Arthur Tsidkilov    9 年前

    一种方式:

         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

        8
  •  1
  •   Satish Kumar sonker    8 年前

    可以调用parse字符串作为javascript函数

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

    调用上面的函数 GETDATE() 这是字符串格式的吗 “GETDATE()”

    1. var callFunc=new Function('getDate()') //解析并注册函数

    2. callFunc() //调用函数