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

JS:在试图将数组作为参数传递时对函数使用eval,但它抛出了一个错误

  •  0
  • therufa  · 技术社区  · 14 年前

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

    这是我的代码:

    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 回复  |  直到 11 年前
        1
  •  4
  •   T.J. Crowder    14 年前

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

    addScale([object Object])

    ……这不是你想要的。那是因为你在打电话 toString 关于你的 opt 对象和默认值 托斯特林 在物体上就是这样。这个 eval 错误是因为这是无效语法。

    一般来说,任何时候你认为你需要使用 评估 ,几乎肯定有更好的答案。在这种情况下,看起来您试图调用函数并传入 选择 . 假设这些函数是“globals”,您可以这样做:

    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. 不使用 for..in 循环遍历数组,除非 really know what you're doing . 为了…在 不枚举数组的索引,而是枚举对象的属性。
    2. 我们使用 window[functionName] . 这是因为“globals”实际上是 window 对象,您可以使用带括号的符号使用字符串名称查找属性。
    3. 通过 窗口[函数名] ,我们直接调用它,传入 对象 选择 而不是它的字符串形式。我想 addScale 期望看到一个对象。
    4. 我把所有的 var 在函数的顶部,因为那是它们真正的位置( details ).
    5. 如果可以的话,我建议你搬家 添加比例 以及与它们自己的对象相关的函数,而不是把它们放在 窗口 . 这个 窗口 命名空间已经很拥挤了。 Here's the live example 修改为不添加任何符号 窗口 相反,把 添加比例 对象上的函数 functions 从那里开始使用。

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

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

    ……其实没用。(如果你 基于这样的条件创建不同的函数,那么它不仅有用,而且是必要的。) recommend using named functions 只要有可能,因为带有名称的函数会在错误消息、调用堆栈等中显示函数名称,从而帮助您的工具帮助您。

    非主题2 :您有一个名为 json ,但仅供参考,它没有使用 JSON 符号。它使用JavaScript数组和object literal表示法的组合,后者是JSON的超集。你会看到很多人对此感到困惑,我提到这件事是因为你说你是新来的,所以值得一试。:-)JSON纯粹是一种符号。(非常有用的一个。)

        2
  •  -1
  •   Martin Prikryl    11 年前

    使用这个:

    fn = eval(functionName);
    fn(objParameter)