2015-07-21 3 views
0

Я пытаюсь передать глобально определенный массив как аргумент функции. Эта функция будет рассматривать аргумент как локальную переменную. Но это не так ... Изменение локальной (по-моему) локальной переменной также изменяет значения глобального массива. Что я делаю не так?Передача глобального массива в функцию overwrites array

clickX = []; 
for(var i=0; i<10; i++) { 
    clickX[i] = i; 
} 
doThis(clickX); 

function doThis(x) { 
    for(var i=0; i<x.length; i++) { 
     x[i]++; 
     alert(clickX[i]); // this alerts the changed value of x[i] and not the origin value of the global array 
    } 
} 

jsfiddle: https://jsfiddle.net/n546rq89/

+2

Объекты передаются по ссылке в JS. ('var x = [1,2,3]; var y = x; y.splice (0, 1); console.log (y); // [2, 3]') – tymeJV

+0

Вы не меняете переменная (которая действительно локальна, как вы можете подтвердить с помощью 'x = []'), вы меняете объект (изменяя его свойства). – Bergi

+0

Спасибо, а не понятнее. Как изменить значения объекта в функции без изменения исходного объекта? Как-то дублировать его? – Henning

ответ

0

В JavaScript массивы передаются по ссылке по умолчанию. В качестве альтернативы вы можете передать ARRAY.slice() передавать по значению:

clickX = []; 
for(var i=0; i<10; i++) { 
    clickX[i] = i; 
} 
doThis(clickX.slice()); 

function doThis(x) { 
    for(var i=0; i<x.length; i++) { 
     x[i]++; 
     alert(clickX[i]); // this alerts the changed value of x[i] and not the origin value of the global array 
    } 
} 

Посмотрите на this thread для объяснения slice() и копирования массива в JS.

Смежные вопросы