Передача глобальной переменной по ссылке и изменение ссылочной переменной - PullRequest
1 голос
/ 27 февраля 2012

Как правильно поступить ...

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 ]

2 голосов
/ 27 февраля 2012

Помимо четырех незначительных синтаксических ошибок, ваш код в порядке: 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' 
0 голосов
/ 27 февраля 2012

Возможно, «правильный» способ сделать это - не писать функции с побочными эффектами. Вы можете написать функцию так, чтобы она возвращала измененную копию массива:

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;
}

Иногда это неизбежно, но программы становятся намного сложнее отлаживать, когда локальные функции изменяют глобальное состояние.

0 голосов
/ 27 февраля 2012

Почему бы и нет:

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];
  }
}());

Заполните свои ботинки. : -)

...