Javascript 理解通过引用传递与函数值传递
据我所知,对象在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引用的属性的值。这称为对象的
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