从Javascript中的字符串生成函数

时间:2010-11-09 18:36:14

标签: javascript jquery string function loops

我正在使用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+='}}';
});

第一部分创建一个2D数组,通过索引将一组案例与其结果输出相关联。因此,收入10美元(例如会议)的东西将被存储在案例[10]中(会议=案例[10] [0])。

第二部分写了一个字符串,它将一个put放入一个看起来像这样的开关语句:

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只是一个包含我想要的函数代码的字符串。怎么做成功能?有一个更好的方法吗?我正在考虑通过PHP发送它以将其返回给jQuery,但这整个事情似乎是间接的,并且可能有一种更简单的方法来执行此操作。

2 个答案:

答案 0 :(得分:5)

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

您可以按字符串创建函数,如下所示:

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

以上相当于:

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

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

new Function('x', autoearn)

答案 1 :(得分:1)

这是从字符串中获取脚本并执行它的一小段代码:

  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参数的内容。