2009-09-16 58 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); 
相關問題