我知道Javascript中的对象是通过引用复制/传递的。但功能怎么样?
当我跳到令人困惑的东西时,我正在尝试这段代码。以下是代码段:
x = function() { console.log('hey 1'); }
y = x;
x = function() { console.log('hey 2'); }
y; // Prints function() { console.log('hey 1'); }
如果通过引用复制/传递像对象这样的函数,为什么y不会更新为打印'hey 2'?
如果这种行为是因为'x'被分配了一个全新的函数,当x改变时,有没有办法将变量'y'变换为新分配的函数?
答案 0 :(得分:5)
JS中的所有内容都是按值传递,其中对象和函数的值是参考。
这里发生的事情与对象相同(因为函数只是first-class objects):
以下是发生了什么的要点:
CultureInfo culture = CultureInfo.CurrentCulture;
x = function() { console.log('hey 1'); }
指向x
(为此功能创建内存)
function() that logs 1
y = x;
指向y
(相同的内存位置)
function() that logs 1
x = function() { console.log('hey 2'); }
现在指向新x
(新内存空间),但不会影响function() that logs 2
y
y;
仍然指向相同的y
如果您希望对function() that logs 1
影响x
进行更改,您应该做的是更改指向的内容,而不是更改他们指出的内容至强>
例如:
y
答案 1 :(得分:1)
如果通过引用复制/传递像对象这样的函数,为什么y不会更新以打印'嘿2'?
你做出错误的假设。 JavaScript中的所有内容都是pass-by-value。对象表示为引用是正确的,但这与pass-by-reference不同。
即使你使用普通对象而不是函数,你也看不到你的期望:
var x = {foo: 42};
var y = x;
x = {foo: 21};
console.log(y.foo); // still 42
传值/参考仅描述如何解析变量和参数,它没有任何关系与变量的值。
如果这种行为是因为' x'分配了一个全新的功能,是否有任何方式可变的' y'当x改变时,到新分配的函数?
没有。并非没有明确指定y
。
答案 2 :(得分:0)
x = function() { console.log('hey 2'); }
不会更改x变量中包含的对象,而是修改x变量的内容。