我有一个数组,我迭代并尝试创建一个变量。
变量的名称是可变的,来自数组。所以我使用eval(这段代码只会在我的本地计算机上使用)来创建变量。 很奇怪我可以创建一个变量并在其内容中添加纯文本。但每当我尝试设置变量变量时,我什么也得不到。
我也在使用Prototype轻松浏览DOM。
var arr_entries = some_DOM_element;
arr_entries_array = new Array();
arr_entries_array[0] = new Array();
arr_entries_array[0][0] = 'name_dd';
arr_entries_array[0][1] = arr_entries.next(13).down().next(1).innerHTML;
arr_entries_array[1] = new Array();
arr_entries_array[1][0] = 'name_pl';
arr_entries_array[1][1] = arr_entries.next(14).down().next().innerHTML;
arr_entries_array[2] = new Array();
arr_entries_array[2][0] = 'name_pm';
arr_entries_array[2][1] = arr_entries.next(15).down().next().innerHTML;
arr_entries_array[3] = new Array();
arr_entries_array[3][0] = 'name_hd';
arr_entries_array[3][1] = arr_entries.next(17).down().next().innerHTML;
arr_entries_array[4] = new Array();
arr_entries_array[4][0] = 'name_sr';
arr_entries_array[4][1] = arr_entries.next(16).down().next().innerHTML;
for(e = 0; e < arr_entries_array.length; e++)
{
eval('var arr_entry_' + arr_entries_array[e][0] + ';');
eval('arr_entry_' + arr_entries_array[e][0] + ' = \'' + arr_entries_array[e][1] + '\';');
}
我可以提醒(arr_entries_array[e][1]
)就好了。我也可以用纯文本替换它,然后警告变量,它会起作用。
第二条评估线是出错的地方,有评论吗?
答案 0 :(得分:2)
Object
上设置属性?如果您发现自己在代码中编写代码然后使用eval()
执行代码,那么您几乎肯定会错误地处理问题。它很慢,难以阅读,并引入了安全漏洞。
JavaScript对象可以包含您想要的任何属性。为什么不只是v = new Object(); v['name_dd'] = whatever...;
,或类似的东西?
答案 1 :(得分:0)
我建议找另一种方法。即使您只在自己的计算机上运行代码并且没有暴露安全违规,从eval到公共eval仍然是错误的并且非常低效。我建议你永远不要使用eval,因为它可能是不可预测的,因为任何其他解决方案可能更有效地处理。
答案 2 :(得分:0)
根据这些Dom元素的innerHTML值,您可能会在eval中获得语法错误。
尝试使用firebug或其他调试工具来确定第二个eval的错误消息,你可能会发现你的罪魁祸首。
我的钱在新线上(\n
)就是问题。
要解决此问题,您需要正确地转义传递给eval的值,使它们是文字字符串,您似乎将它们用作eval语句中的字符串。 e.g。
var text = "' quotes can be tricky"
eval("var variable = '" + text + "';"); //syntax error
eval("var variable = '" + text.replace(/'/g, "\'") + "';"); //works
var text2 = "\n new lines also"; //this may not be 100% correct, you get the idea
eval("var variable = '" + text2 + "';"); //another syntax error
eval("var variable = '" + text2.replace(/\n/g, "\\n") + "';"); //works