Javascript 理解通过引用传递与函数值传递

Javascript 理解通过引用传递与函数值传递,javascript,Javascript,据我所知,对象在JavaScript中是通过引用传递的(原语是通过值传递的?) 这与数组的工作原理类似,但与我预期的函数工作原理不同: var a, b; a = function(){ return 20; } b = a; a = function(){ return 40; } console.log(b()); // returns 20 ? 我很困惑,因为我认为函数是对象。上面的示例不应该返回40吗?在第一种情况下,a.Foo=…,您正在更改对象中由a和b引用的属性的值。这称为对象的

据我所知,对象在JavaScript中是通过引用传递的(原语是通过值传递的?)

这与数组的工作原理类似,但与我预期的函数工作原理不同:

var a, b;
a = function(){ return 20; }
b = a;
a = function(){ return 40; }
console.log(b()); // returns 20 ?

我很困惑,因为我认为函数是对象。上面的示例不应该返回40吗?

在第一种情况下,
a.Foo=…
,您正在更改对象中由
a
b
引用的属性的值。这称为对象的变异

但是在第二种情况下,您正在使
a
引用一个新的函数对象。现在,
a
b
指的是不同的函数对象


这就是为什么在第二种情况下会得到
20

将变量
a
重新分配给一个新函数。这与更改属性值不同

尝试:

进一步,考虑下面的声明,说明你的函数是对象:


首先,关于标题中的问题(实际上与您用代码示例演示的内容不同):

“据我所知,对象在JavaScript中是通过引用传递的”

不,Javascript根本不支持通过引用传递参数。所有参数都按值传递,但值可以是引用

例如:

var a = { answer: 42 };

function f(x) {
  alert(x.answer); // shows 42
  x = { answer: 0 };
  alert(x.answer); // shows 0
}

f(a);
alert(a.answer); // shows 42
由于参数通过值传递,变量
x
与变量
a
是分开的,因此将新对象分配给
x
不会改变
a
的值

回到您的代码:

将对象引用从一个变量指定给另一个变量时,复制的是引用,而不是对象。得到两个引用同一对象的变量

这两个变量都可以用来访问对象中的成员,您的第一个代码示例演示了这一点

如果将新对象指定给第一个变量,则将替换变量中的引用,而不会覆盖当前指向的对象。对象仍然完好无损,第二个变量仍然指向它。得到两个变量,每个变量指向一个对象,第二个代码示例演示了这一点

var a, b;
a = {Foo: function() {return 20;}};
b = a;
a.Foo = function() {return 40;};
console.log(b()); // returns 40
var a, b;
a = function() { return 20; }
a.Foo = "Bar";
b = a;
a.Foo = "Other";
console.log(b.Foo); // "Other"
var a = { answer: 42 };

function f(x) {
  alert(x.answer); // shows 42
  x = { answer: 0 };
  alert(x.answer); // shows 0
}

f(a);
alert(a.answer); // shows 42