2016-04-16 1 views
0

Почему я могу добавить что-то в глобальный объявленный массив, но не изменить значение самой переменной?Глобальная переменная JavaScript не изменена

Это работает:

var test = [5, 5]; 
 
function a(test) { 
 
    test.push(8); 
 
} 
 
a(test); 
 
console.log(test); 
 
//expected: [5, 5, 8]

Но это не делает:

var test = [5, 5]; 
 
function a(test) { 
 
    test = 8; 
 
} 
 
a(test); 
 
console.log(test); 
 
//expected: 8 but is [5, 5]

ответ

1

В вашем втором коде, вы передаете ссылку вашего array объекта как аргумент функции a. И вы отключите связь ссылки внутри этой функции, назначив новую primitive value переменной, которая содержит reference. Следовательно, массив в глобальной области не будет затронут вообще.

Этот случай аналогичен,

var x = []; 
var y = x; //setting the reference of the object x to y 
y = 10; //cutting off the connection to the reference. 

console.log(y); //10 
console.log(x); //[] 

Если вы не заменить ссылку с примитивным значением тогда,

var x = []; 
var y = x; //setting the reference of the object x to y 
y.push(10); 

console.log(y); //[10] 
console.log(x); //[10] 
console.log(x == y); //true 

В принципе, используя значение в глобальном масштабе может вызвать ненужные конфликты. Тем не менее, если вы хотите достичь того, что хотите, удалите параметр функции a.

var test = [5, 5]; 
function a() { 
    test = 8; 
} 
a(); 
console.log(test); //8 
+0

Это имеет смысл, но как я могу его решить? Мне нужно изменить значение глобальной переменной. – thepieterdc

1

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

test = 8; // it is no longer pointing to the earlier object in memory so that object value has not changed, just that this reference is pointing to new object. 

После этого метода a() был закончен он потерял объект, который был в локальной области, и восстановил те, который был в за пределами области.

Если вы хотите изменить значение test и при прохождении значения массива затем

var test = [5, 5]; 
function a(test) { 
    test.splice(0,test.length); 
    test.push(8) 
} 
a(test); 
console.log(test); 

Это первая очистить test массив и нажмите 8 в него.

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

  • Нет связанных вопросов^_^