JS:在尝试将数组作为参数传递时对函数使用eval,但它会引发错误

时间:2010-11-23 08:39:44

标签: javascript json object eval

我想使用javascript创建动态生成的表单,一切正常,直到我尝试将数组作为参数传递。当我这样做时,会发生错误。 Coulr有人解释这是什么?

继承我的代码:

var loadFrm = function(component) {
    for(nItem in component) {
        var myComponent = "add" + firstToUpper(component[nItem].type);
    var callComponent = myComponent + "(" + component[nItem].opt + ");";
    eval(callComponent);
    }
}

var json = [
    {
        type: "scale",
        opt: {content: [{label: "male", value: "m"}, {label: "female", value: "f"}]}
    }
];

loadFrm(json);

修改以下是错误:

missing ] after element list
[Break on this error] addScale([object Object]);

2 个答案:

答案 0 :(得分:4)

如果您使用调试器查看字符串callComponent,您可能会发现它看起来像这样:

addScale([object Object])

......这不是你想要的。那是因为您在toString对象上有效地调用了opt,对象上的默认toString就是这样。 eval错误是因为语法无效。

一般来说,只要您认为需要使用eval,几乎肯定会有更好的答案。在这种情况下,您似乎正在尝试调用函数并传入opt。假设这些函数是“全局”,你可以这样做:

var loadFrm = function(component) {
    var nItem, functionName;

    for (nItem = 0; nItem < component.length; ++nItem) {
        functionName = "add" + firstToUpper(component[nItem].type);
        window[functionName](component[nItem].opt);
    }
}

Live example

以上注释:

  1. 除非really know what you're doing,否则请勿使用for..in循环遍历数组。 for..in不枚举数组的索引,它枚举对象的属性。
  2. 我们使用window[functionName]按名称查找功能。这是因为“全局”实际上是window对象的属性,您可以使用括号表示法为它们使用字符串名称查找属性。
  3. 通过window[functionName]获取功能后,我们只需直接调用它,传入对象 opt而不是字符串形式。我假设addScale期望看到一个对象。
  4. 我将所有var移到了函数的顶部,因为它就是它们的真实位置(details)。
  5. 如果可以的话,我建议将addScale及相关功能移到自己的对象上,而不是将它们放在window上。 window命名空间已经非常拥挤。 Here's the live example被修改为根本不向window添加任何符号,而是将addScale函数放在名为functions的对象上并从那里使用它。

  6. 偏离主题:语法var loadFrm = function(component)创建一个匿名函数,然后将其分配给变量。这是经常使用的,但除非您根据条件创建不同的函数,例如:

    var f;
    if (...) {
        f = function() { ... };
    }
    else {
        f = function() { ... };
    }
    

    ......它实际上并没有用。 (如果你 基于这样的条件创建不同的函数,那么它不仅有用,而且是必要的。)我尽可能recommend using named functions,因为具有名称的函数可以帮助您的工具提供帮助你通过向错误消息,调用堆栈等显示函数名称

    非主题2 :您有一个名为json的变量,但是FYI,它没有使用JSON表示法。它使用JavaScript数组和对象文字符号的组合,它是JSON的超集。你会看到很多人对此感到困惑,我提到它是因为你说你是新手,所以它值得扼杀在萌芽状态。 :-) JSON纯粹是一种表示法。 (非常有用。)

答案 1 :(得分:-1)

使用此:

fn = eval(functionName);
fn(objParameter)