函数(a,b){a = b; }不会改变javascript中的值

时间:2014-06-29 17:39:05

标签: javascript function reference arguments variable-assignment

我编写了如下代码:

function setAtoB(a, b) {
    console.log('entered function');
    a = b;
}
var x = {};
var y = {'t':3};
setAtoB(x, y);
console.log(x);
然后我得到了这样的输出:

entered function
{}

在我看来,x应该是{' t':3}。有谁知道为什么它仍然{},以及如何在函数中分配值?

2 个答案:

答案 0 :(得分:4)

在setAtoB函数中,你将用b替换a,这会打破对调用堆栈中一个级别更高的调用者的引用。将对象传递给函数时,可以在不破坏该链接的情况下替换它们的属性,但是当您执行任何类型的重新分配时,该链接断开并创建一个新对象。

例如,如果您只替换属性,则保留引用:

function setAtoB(a, b) {
    console.log('entered function');
    a.t = b.t;
}
var x = {};
var y = {'t':3};
setAtoB(x, y);
console.log(x);    // output: Object {t: 3} 

答案 1 :(得分:4)

JavaScript始终是按值传递的,因此您无法直接执行您所描述的内容。将对象的引用传递给函数时,可以修改对象的属性,但不能更改调用环境中使用的原始变量。换句话说,在通话中:

setAtoB(x, y);

它是传递给函数的变量“x”值的副本。变量“x”的值是对象的引用,因此该引用的副本是传递的内容。该引用与“x”中仍然存在的副本一样,可以对引用的对象进行更改,但更改包含副本的参数对“x”的值没有影响。