Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:在尝试将数组作为参数传递时对函数使用eval,但它会抛出错误_Javascript_Json_Object_Eval - Fatal编程技术网

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

Javascript JS:在尝试将数组作为参数传递时对函数使用eval,但它会抛出错误,javascript,json,object,eval,Javascript,Json,Object,Eval,我想使用javascript创建一个动态生成的表单,一切正常,直到我尝试将数组作为参数传递。当我这样做时,会发生错误。有人能解释一下这是什么吗 这是我的密码: var loadFrm = function(component) { for(nItem in component) { var myComponent = "add" + firstToUpper(component[nItem].type); var callComponent = myCompone

我想使用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]);

如果使用调试器查看字符串
callComponent
,您可能会发现它的外观如下:

addScale([object Object])
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);
    }
}

关于上述事项的说明:

  • 不要使用
    for..in
    在数组中循环,除非
    for..in
    不枚举数组的索引,而是枚举对象的属性
  • 我们使用
    窗口[functionName]
    按名称查找函数。这是因为“globals”实际上是
    窗口
    对象的属性,您可以使用括号表示法使用字符串名称查找属性
  • 通过
    窗口[functionName]
    获取函数后,我们直接调用它,传入对象
    opt
    ,而不是它的字符串形式。我假设
    addScale
    希望看到一个对象
  • 我将所有的
    var
    s移到了函数的顶部,因为它们实际上就在那里()
  • 如果可以,我建议将
    addScale
    和相关函数移动到它们自己的对象,而不是将它们放在
    窗口中。
    窗口
    名称空间已经相当拥挤。修改为根本不向
    窗口添加任何符号,而是将
    addScale
    函数放在名为
    functions
    的对象上并从那里使用它

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

    var f;
    if (...) {
        f = function() { ... };
    }
    else {
        f = function() { ... };
    }
    
    …它实际上没有用。(如果您正在基于这样的条件创建不同的函数,那么它不仅有用,而且是必要的。)I只要可能,因为带有名称的函数可以帮助您的工具,通过在错误消息、调用堆栈等中显示函数名来帮助您


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

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

    addScale([object Object])
    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);
        }
    }
    

    关于上述事项的说明:

  • 不要使用
    for..in
    在数组中循环,除非
    for..in
    不枚举数组的索引,而是枚举对象的属性
  • 我们使用
    窗口[functionName]
    按名称查找函数。这是因为“globals”实际上是
    窗口
    对象的属性,您可以使用括号表示法使用字符串名称查找属性
  • 通过
    窗口[functionName]
    获取函数后,我们直接调用它,传入对象
    opt
    ,而不是它的字符串形式。我假设
    addScale
    希望看到一个对象
  • 我将所有的
    var
    s移到了函数的顶部,因为它们实际上就在那里()
  • 如果可以,我建议将
    addScale
    和相关函数移动到它们自己的对象,而不是将它们放在
    窗口中。
    窗口
    名称空间已经相当拥挤。修改为根本不向
    窗口添加任何符号,而是将
    addScale
    函数放在名为
    functions
    的对象上并从那里使用它

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

    var f;
    if (...) {
        f = function() { ... };
    }
    else {
        f = function() { ... };
    }
    
    …它实际上没有用。(如果您正在基于这样的条件创建不同的函数,那么它不仅有用,而且是必要的。)I只要可能,因为带有名称的函数可以帮助您的工具,通过在错误消息、调用堆栈等中显示函数名来帮助您

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

    使用以下方法:

    fn = eval(functionName);
    fn(objParameter)
    
    使用以下命令:

    fn = eval(functionName);
    fn(objParameter)
    

    谢谢你的建议。你能为可能的解决方案写一个演示代码吗?我是个新手,对JS中的解决方案没有太大的设想。@Nort:这就是解决方案的代码。我将在一秒钟内提供一个实例。谢谢你的建议。你能为可能的解决方案写一个演示代码吗?我是个新手,对JS中的解决方案没有太大的设想。@Nort:这就是解决方案的代码。我会在一秒钟内给出一个活生生的例子。请解释你的答案?请解释你的答案?