2011-03-02 79 views
1

我讀過類似的主題,但找不到答案。如何在函數中設置全局變量

下面是代碼:

foo_arr = ["a", "b", "c"] 
bar_arr = ["x", "y"] 

test(bar_arr); 
document.write(bar); 

function test(arr_name) { 
    bar = Math.random()*arr_name.length; 

    if (bar < 1) {test(arr_name)} 
} 

正如你可以看到我通過數組名的功能,但如果我需要什麼傳遞變量嗎?例如

test(bar, bar_arr); 

function test(var_name, arr_name) { 
    var_name = Math.random()*arr_name.length; 

它不起作用。爲什麼以及如何做到這一點?

回答

6

您不能在JavaScript中傳遞(引用)變量,只能傳遞它們的值。即使使用bar_arr,您只傳遞數組的「值」,這是一個對象 - 您可以通過這種方式修改對象的屬性,但不能自行更改bar_arr

要真正「傳遞」一個變量,請將上述技巧退回一步,並使用包含變量的對象作爲屬性。在這種情況下,是window對象,它的所有的全局變量的屬性:

function test(var_name) { 
    window[var_name] = 'foo'; 
} 

test('bar'); // note that the property name is a string, not a variable 
alert(bar); // now the global 'bar' is set 
+0

這正是我所需要的。謝謝! – 2011-03-02 17:13:06

2

如果你只想設置一個全局變量的值,你可以從你fonction返回想要的值:

function test(arr_name) { 
    return Math.random()*arr_name.length; 
} 

bar = test(bar_arr); 

我真的不知道這是你想要做什麼,但我如果我能夠提供幫助,我很高興。

+0

謝謝。我想過'返回',但無法弄清楚如何執行函數的第二部分:'if(bar <1){test(arr_name)}' – 2011-03-02 17:25:12

0

如果var_name是一個全局變量,你仍然可以訪問它裏面function test。 例如:

var_name; // global 
function test(arr_name) { 
    var_name = Math.random()*arr_name.length; // still accessible here 

    if (bar < 1) {test(arr_name)} 
} 
+0

謝謝,我知道,但我需要用不同的參數多次運行函數,然後在其他函數中使用這些新變量。 – 2011-03-02 17:12:09

+0

然後,也許最好遵循@ Krtek的提示並讓函數返回一個值。循環播放時,您可以將所有返回值推送到新數組中。我希望有所幫助。 – erickb 2011-03-02 17:21:13

+0

我試過@卡薩布蘭卡的答案,它的工作完美。這個函數比2行稍長一點,我不知道如何在這裏使用'結果',因爲我仍然需要這個函數中的變量。 – 2011-03-02 17:36:14