通过引用传递全局变量并修改引用的变量

时间:2012-02-27 00:16:03

标签: javascript pass-by-reference

正确的做法是什么......

var array1 = []
var array2 = []

function doIt(arg){
    var myArray;

    if(arg == 1){
        myArray = array1
    }else if(arg == 2){
        myArray = array2
    }

    myArray.push('test');

}

doIt(1); //array1 should now be ['test'] but it's empty

3 个答案:

答案 0 :(得分:2)

除了四个轻微的句法瑕疵之外,你的代码还可以:http://jsfiddle.net/hk9Md/

var array1 = []; // <-- added semi-colon
var array2 = []; // <-- added semi-colon

function doIt(arg){
    var myArray;

    if (arg == 1) {
        myArray = array1; // <-- added semi-colon
    } else if (arg == 2) {
        myArray = array2; // <-- added semi-colon
    }
    myArray.push('test');
}
doIt(1);
alert(array1[0]); // produces 'test' 

答案 1 :(得分:0)

为什么不:

var myArray = arg == 1? array1 : array2;

如果有两个以上的选择,您可以尝试:

var source = {
  '1': array1,
  '2': array2,
  '3': array3,
  ...
}

或零索引:

var source = [ ,array1, array2, array3, ...];

然后:

function doIt(arg) {
  var myArray = source[arg];
  ...
}  

甚至:

var doIt = (function() {
  var source = {
    '1': array1,
    '2': array2,
    '3': array3,
    ...
  }
  return function (arg) {
    var myArray = source[arg];
  }
}());

填充你的靴子。 : - )

答案 2 :(得分:0)

可以说,做到这一点的“正确”方法不是编写带副作用的函数。您可以编写该函数,以便它返回数组的修改副本:

var array1 = [1, 2, 3],
    array2 = [4, 5, 6],
    x = getUserInput(),
    result = doIt(1, x == 1 ? array1 : array2);

function doIt(arg, original_array){
  var copy = [].concat(original_array);
  // ...
  return copy;
}

有时它是不可避免的,但是当本地函数改变全局状态时,程序变得更难调试。