【问题标题】:Generating a function from a string in Javascript从 Javascript 中的字符串生成函数
【发布时间】:2011-05-07 10:29:34
【问题描述】:

我正在使用 jQuery 从 xml 文件中获取数据并将其保存到字符串中。字符串是一个switch语句,我想变成一个函数。

$.get('type.xml', function(xml) {
var cases=[];
$(xml).find('type').each(function(){
    index=parseInt($(this).find('earn').text());
    if($.isArray(cases[index])){
        cases[index].push($(this).find('name').text());
    }else{
        arr=$.makeArray($(this).find('name').text());
        cases[index]=arr;
    }
});
var autoearn="function(x){switch(x){";
for(i=0;i<=100;i+=5){
    if($.isArray(cases[i])){
        $.each(cases[i], function(index,v){
            autoearn+='case "'+v+'":';
        });
        autoearn+='$("input[name^=\'earn\']").val('+i+');break;';
}}
autoearn+='}}';
});

第一部分创建一个二维数组,该数组通过索引将一组案例与其结果输出相关联。这样收入 10 美元的东西(例如会议)将存储在 case[10] (Meeting=cases[10][0]) 中。

第二部分写入一个字符串,该字符串将一个 puts 放入一个类似这样的 switch 语句中:

function(x){    
    switch(x){
        case "Meeting":
            $("input[name^='earn']").val(10);
            break;
        case "Event1":
        case "Event2":
            $("input[name^='earn']").val(20);
            break;
    }
}

请注意,switch case 的语法使 Event1 和 Event2 具有相同的结果。

现在 autoearn 只是一个字符串,其中包含我想要的函数的代码。如何make成一个函数?有一个更好的方法吗?我正在考虑通过 PHP 发送它以将其返回给 jQuery,但这整个事情似乎真的很间接,并且可能有更简单的方法来做到这一点。

【问题讨论】:

    标签: javascript jquery string function loops


    【解决方案1】:

    首先,确保字符串中的代码是可信的,否则执行任意代码会遇到问题。

    您可以按如下方式从字符串创建函数:

    var f = new Function('arg1', 'arg2', ..., 'function code');
    

    以上等价于:

    function f(arg1, arg2, ...) {
      function code
    }
    

    在您的情况下,您可能希望从 autoearn 字符串中删除 function(x) 和左/右大括号并创建如下函数:

    new Function('x', autoearn)
    

    【讨论】:

    • 效果很好,谢谢!我只是忘了你可以做这样的功能。
    • 这两个函数几乎是等价的,Function 构造函数不能访问任何局部作用域(闭包),它基本上是全局的,而字面量函数可以访问局部变量。如果您确实需要访问局部变量,您可以使用邪恶的eval 生成函数。见stackoverflow.com/questions/4599857/…
    【解决方案2】:

    下面是一小段代码,用于从字符串中获取脚本并执行它:

      function loadScript(script) {
        var func = null;
    
        if (script) {
          try {
            func = new Function(script);
          } catch (eParse) {
            console.error("Error parsing script.");
            console.debug(" error : %o", eParse);
            console.debug(" script: %s", script);
          }
        }
        if (func) {
          try {
            func(); // beware of scoping here, you might want to call this differently
          } catch (eExec) {
            console.error("Error running code.");
            console.debug(" error : %o", eExec);
          }
        }
      }
    

    注意:使用new Function 基本上与使用eval 语句一样危险。请确定您收到的 script 参数的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2016-02-22
      相关资源
      最近更新 更多