为什么我的代码不会附加到循环内的字符串?
问题描述:
我正在使用jQuery,通过循环建立一个表。我认为这样做将创建一个数组的最佳途径然后做$(blah).html(table);
为什么我的代码不会附加到循环内的字符串?
var settings_table = '<open the table>';
$.each(settings, function(i, val){
var settings_table = settings_table+'<put stuff in it>';
});
var settings_table = settings_table+'<close it>';
$('#rscc_opts').html(settings_table);
但是,这是行不通的。我假设我做错了。或者你能否提出更好的解决方案?我的阵列是这样形成的:
var settings = [
{
var1: 'foo',
var2: 'foo',
},
{
var1: 'foo',
var2: 'foo',
}
];
答
这里的主要问题。
每次你说“var settings_table”时,你都会隐藏这个变量。除了settings_table的第一个声明之外,除去“var”关键字。
答
要扩大iftrue的回答是:
第一次声明一个变量,如果你不指定“变种”,你是说明它是一个全局变量。
如果使用“var”关键字,则该变量对该特定函数“有作用域”。这意味着它的数据只能由该函数内的代码访问。这意味着该函数以外的任何内容都无法访问该变量。另一个函数可以使用相同的名称定义相同的变量,并且可以存储完全不同的值。
$.each(settings, function(i, val){
var settings_table = settings_table+'<put stuff in it>';
});
这里的诀窍是你正在定义一个新的匿名函数供迭代器使用。此功能具有自己的范围(它自己的个人数据)。这意味着通过声明“var settings_table”,你说“创建一个全新的变量,特定于这个函数”。所以,你实际做的是将表数据分配给一个全新变量,然后在循环的下一次迭代中丢失数据。
function BuildTable(i, val){
var settings_table = settings_table+'<put stuff in it>';
}
$.each(settings, BuildTable);
你真正想要做的是什么东西,可以是有点棘手,它被称为“封闭”:如果我们重新写这个,因为这可能会更清楚。闭包是一个高级的javascript主题。但是,从根本上,你在做什么时说:“嘿,我想让这个匿名函数有我的个人数据访问”
在你的情况,你需要做的是:
var settings_table = '<open the table>';
$.each(settings, function(i, val){
settings_table = settings_table+'<put stuff in it>';
});
settings_table = settings_table+'<close it>';
$('#rscc_opts').html(settings_table);
我高度推荐这读:http://stackoverflow.com/questions/111102/how-does-a-javascript-closure-work – Matt 2009-09-16 22:02:07
谢谢马特。它变得更加敏锐。 – 2009-09-16 23:04:03