js中的函数通过值或引用复制/传递

时间:2015-11-19 16:13:59

标签: javascript

我知道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'变换为新分配的函数?

3 个答案:

答案 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变量的内容。