使用evaljavascript创建动态变量
我需要类似于关联数组的东西,它包含变量名/元素ID的配对 通过此数组/对象循环,将元素ID分配给与其对应的变量名。大概是这样的:使用evaljavascript创建动态变量,javascript,jquery,Javascript,Jquery,我需要类似于关联数组的东西,它包含变量名/元素ID的配对 通过此数组/对象循环,将元素ID分配给与其对应的变量名。大概是这样的: $('#mybutt').click(function(){ for (var key in objFields){ var tmp = objFields[key]; eval('var ' + key+ ' = $("#' +tmp+ '").val()'); } }); 您根本不需要这个eval(),您希望避免
$('#mybutt').click(function(){
for (var key in objFields){
var tmp = objFields[key];
eval('var ' + key+ ' = $("#' +tmp+ '").val()');
}
});
您根本不需要这个
eval()
,您希望避免它。您真正需要做的是:
for (var key in objFields){
alert(key+': '+objFields[key]);
window[key] = objFields[key];
}
将为您提供:
'f1':'fld_1'
'f2':'fld_2'
'f3':'fld_3'
其中:
f1 = 'fld_1';
f2 = 'fld_2';
f3 = 'fld_3';
如果它是一个全局变量,则简单如下:
window[key] = objFields[key];
或
第二个是稍微少一点的奇怪的名字免疫。如果你知道你在做什么,并且绝对肯定,那么使用这个:
eval(key + " = " + JSON.stringify(objFields[key]));
或者,如果需要局部变量:
eval("var " + key + " = " + JSON.stringify(objFields[key]));
否则,我建议您实现另一个答案。eval函数运行字符串add代码并返回结果
您的代码所做的是评估未定义的键的vague,然后尝试将其设置为新值。
就像写5=4
正确语法:
eval('var ' + key + ' = ' + objFields[key]);
您必须设置变量而不使用会生成全局变量的objFields[“f1”]
?window[key]
是否有特殊原因,但我建议不要将任意变量放入全局范围。我认为,如果您认为需要将数据写入全局范围,您可能正在处理不知道如何从函数调用之外的异步调用访问项的问题。这里正确的方法是回调。第二种方法不会像op所希望的那样工作,因为您只需要创建一个名为key
的变量/属性,我希望您的答案是正确的,因为您的名称非常接近eval
JCOC611是正确的——需要JSON.stringify,除非var移到eval表达式之外。请参见,当您在浏览器控制台中执行eval('var testing=5')
时,它仍然被创建为窗口
对象的属性,但当您执行此操作时,它不是。我在这里遗漏了什么吗?@Stryner:在浏览器控制台中使用var
几乎没有任何作用,因为它不在任何代码块中(它在全局范围内)。@Stryner,看看左边的选项,你的JS代码在onLoad函数调用中运行,你可以把它改为“头上无包裹”,然后你会看到它被设置为一个全局变量你也是对的,斯宾塞,但我不清楚我是怎么问这个问题的。这里是使用您的解决方案。它工作得很好,但实际用途仍然需要eval。@crashwap当然,我的意思是,如果这是用户以任何方式输入,通常避免eval()
,这是一个好主意,因为它可能被滥用。
eval("var " + key + " = " + JSON.stringify(objFields[key]));
eval('var ' + key + ' = ' + objFields[key]);