2009-09-16 26 views
0

我正在使用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', 
    } 
]; 
+1

我高度推荐这读:http://stackoverflow.com/questions/111102/how-does-a-javascript-closure-work – Matt 2009-09-16 22:02:07

+0

谢谢马特。它变得更加敏锐。 – 2009-09-16 23:04:03

回答

5

这里的主要问题。

每次你说“var settings_table”时,你都会隐藏这个变量。除了settings_table的第一个声明之外,除去“var”关键字。

+0

谢谢。不知道会覆盖它。认为它可能像PHP一样工作。 – 2009-09-16 21:38:14

+0

@Ben这很棘手,因为即使代码看起来与您在PHP中可能做的相似,但它确实完全不同。在PHP中,你正在做更类似于for(int i = 0; i Matt 2009-09-16 21:52:10

+0

不是。变量**被声明一次**,一旦进入函数的执行上下文并且在函数体内的任何其他语句被评估之前。 Fwiw,**函数声明**在同一时间实例化,也在实际评估之前。稍后,在循环过程中,只有一项任务正在进行。 – kangax 2009-09-16 21:59:22

0

要扩大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); 
相关问题