Работа с массивами, прошедшими byref - PullRequest
2 голосов
/ 23 апреля 2010

Я бы хотел, чтобы кто-нибудь объяснил мне:

function myFunction(array){
    array = $.grep(array, function(n,i){return n > 1 });
}

var mainArray = [1,2,3];

myFunction(mainArray);
document.write(mainArray) // 1,2,3, but i'm expecting 2,3

но если я сделаю что-то вроде

    array[3] = 4;

вместо строки $.grep, я получаю 1,2,3,4. Разве mainArray не должен стать новым массивом, созданным $.grep?

Ответы [ 2 ]

5 голосов
/ 23 апреля 2010

Нет, параметр array также является локальной (справочной) переменной. Функция присваивает новый массив этой переменной, но это не влияет на переменные вызывающего. Все параметры (включая ссылки) передаются по значению.

Если вы изменили (мутировали) содержимое array, это было бы иначе:

function myFunction(array){
    var grepResult = $.grep(array, function(n,i){return n > 1 });
    array.length = 0;
    Array.prototype.push.apply(array, grepResult);
}
4 голосов
/ 23 апреля 2010

Именно из-за стратегии оценки , которую реализует JavaScript.

Ваша функция получает копию ссылки на объект , этоссылочная копия связана с формальным параметром и является его значением, а присвоение нового значения аргументу внутри функции не влияет на объект вне функции (исходная ссылка).

Этот вид стратегии оценкииспользуется многими языками и известен как вызов по общему доступу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...