我想使用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]);
答案 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);
}
}
以上注释:
for..in
循环遍历数组。 for..in
不枚举数组的索引,它枚举对象的属性。window[functionName]
按名称查找功能。这是因为“全局”实际上是window
对象的属性,您可以使用括号表示法为它们使用字符串名称查找属性。window[functionName]
获取功能后,我们只需直接调用它,传入对象 opt
而不是字符串形式。我假设addScale
期望看到一个对象。var
移到了函数的顶部,因为它就是它们的真实位置(details)。addScale
及相关功能移到自己的对象上,而不是将它们放在window
上。 window
命名空间已经非常拥挤。 Here's the live example被修改为根本不向window
添加任何符号,而是将addScale
函数放在名为functions
的对象上并从那里使用它。 偏离主题:语法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)