Javascript JS:在尝试将数组作为参数传递时对函数使用eval,但它会抛出错误
我想使用javascript创建一个动态生成的表单,一切正常,直到我尝试将数组作为参数传递。当我这样做时,会发生错误。有人能解释一下这是什么吗 这是我的密码: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
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:这就是解决方案的代码。我会在一秒钟内给出一个活生生的例子。请解释你的答案?请解释你的答案?