2010-11-30 54 views
0

我有多個單一方法執行操作的全局數組。該方法一次只需要對一個數組進行操作。我想通過給方法傳遞一個參數來實現這一點,然後讓方法根據該參數決定需要修改哪個數組。例如,JavaScript Globals - 方法處理

var globalarray1; 
var globalarray2; 

Operate(globalarray1); 

function Operate(globalarray){ 
    globalarray.push("test"); 
} 

當然,上面的代碼只改變了本地數組的值到方法的作用域。我知道我可以這樣做:

var globalarray1; 
var globalarray2; 

Operate(1); 

function Operate(flag){ 
    if (flag == 1){ 
     globalarray1.push("test1"); 
    } 
    else if (flag == 2){ 
     globalarray2.push("test2") 
    } 
} 

但是,它只是不舒服。如何在不使用大量條件語句的情況下使用單個方法中的參數更改全局變量的值?

+0

感覺對我來說 – hunter 2010-11-30 18:29:16

回答

2

你的第一種方法是正確的。然而,這種說法並不是:

當然,上面的代碼只改變了本地數組的值到方法的作用域。

對象Array 通過由共享稱爲參考 傳遞(即,參考通過值傳遞,而不是值本身)。當你將數組傳遞給方法時,它可以(並且在你的情況下)實際上修改全局變量。如果您傳遞了不可變或原始值(如數字或字符串),則情況不會如此。在這些情況下,價值實際上是本地的方法範圍。

你的變量是全局的這一事實與它無關。拿這個代碼,例如:

function Hello(){ 
    var localArray = []; 
    Operate(localArray); 

    // now, localArray has been modified by Operate 
} 

Hello(); 

以上,localArray不是一個全局變量,但它仍然可以通過操作()如果你通過在陣列中直接受到影響。

+1

一件小事:IMO聲明``對象通過引用傳遞```可能會造成某種混淆,例如,如果您嘗試爲參數指定另一個值,則原始引用將保持不變更改,通過引用真正傳遞對象的語言行爲有所不同(又稱爲*,通過引用*)。我總是說:「引用是通過價值傳遞的」(又名*通過分享*)來避免混淆。 [更多信息](http://dmitrysoshnikov.com/ecmascript/chapter-8-evaluation-strategy/) – CMS 2010-11-30 18:47:43

1

.push是一種變異方法,它會改變方法傳遞的數組,因爲對象是通過引用傳遞的而不是ECMAScript中的值。所以第一種方法是正確的。