2010-11-30 52 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中的值。所以第一种方法是正确的。