2011-08-26 146 views
0

我在JavaScript中有一個數組,可以去深,因爲我想:的Javascript:函數中調用函數和覆蓋變量

var steps = [ 
    { "step_id" : "1", "step_name" : "Step 1", "children" : 
     [ 
      { "step_id" : "4", "step_name" : "Step 4", "children" : 
       [ 
        { "step_id" : "6", "step_name" : "Step 6" } 
       ] 
      }, 
      { "step_id" : "5", "step_name" : "Step 5" } 
     ] 
    }, 
    { "step_id" : "2", "step_name" : "Step 2" }, 
    { "step_id" : "3", "step_name" : "Step 3" } 
]; 

我再要顯示的每個步驟中選擇下拉框。對於每一個孩子的步驟,我想縮進它。這裏是我的JS

function stepsChildren(children, count) { 
    var new_count = count + 1; 
    var selection_values_children = ''; 
    for(j=0;j<children.length;j++) { 
     selection_values_children += '<option value="' + children[j].step_id + '">'; 
     for(x=1;x<=count;x++) { 
      selection_values_children +='&nbsp;&nbsp;&nbsp;'; 
     } 
     selection_values_children += children[j].step_name + '</option>'; 
     if (typeof(children[j].children) != 'undefined') 
      selection_values_children += stepsChildren(children[j].children, new_count); 
    } 
    return selection_values_children; 
} 

var selection_values = ''; 
for(i=0;i<steps.length;i++) { 
    selection_values += '<option value="' + steps[i].step_id + '">' + steps[i].step_name + '</option>'; 
    if (typeof(steps[i].children) != 'undefined') 
     selection_values += stepsChildren(steps[i].children, 1); 
} 

document.write('<select>' + selection_values + '</select>'); 

這幾乎是在stepsChildren但是工作()功能Ĵ變量被改寫我每次調用它。它幾乎就像將全局變量設置爲j一樣。

我有道理嗎?

如果不是我已經把樣品給你看:http://jsfiddle.net/CJbnm/

如果您運行代碼,看看右邊的選擇框,請注意第5步從陣列中丟失?

這是因爲在步驟4中只有一個孩子,其更新Ĵ變量設置爲1,而不是2父功能,並且不顯示任何結果...

回答

7

如果你不」 t使用關鍵字var創建變量,它將是全局變量,並且您將獲得所描述的行爲。在JavaScript中,我總是使用for循環,比如for(var i=0;i<10;i++),因爲在使用循環時,我幾乎從不打算讓循環變量成爲全局變量。我相信這是你的問題。

+0

您先生是一個傳奇!感謝Adam :) –

+0

我(通常)以同樣的方式聲明我的循環索引,但請記住,JavaScript沒有塊範圍,因此(在您的示例中)''我將可以訪問包含'for'的其餘函數的其餘部分循環,而不只是在循環內。 – nnnnnn