JavaScript全局变量未更改

时间:2016-04-16 12:27:05

标签: javascript global-variables

为什么我可以向全局声明的数组添加内容,但不能更改变量本身的值?

这有效:

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]

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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推入其中。