2015-11-19 74 views
4

我知道Javascript中的对象是通过引用复制/传递的。但功能呢?通过值或引用复制/传递的js中的函数

当我跳到一些令人困惑的事情时,我试着用这段代码。以下是代码片段:

x = function() { console.log('hey 1'); } 
 

 
y = x; 
 

 
x = function() { console.log('hey 2'); } 
 

 
y; // Prints function() { console.log('hey 1'); }

如果状物体的功能被复制/按引用传递,为什么不更新y以打印“哎2”?

如果这种行为是因为'x'被分配了一个全新的函数,当x改变时,是否有任何方法将变量'y'分配给新分配的函数?

+0

如果你使用'{x:1}'和'{x:2}'而不是'function(){console.log('hey 1'),那么这种行为是相同的。 }'和'function(){console.log('hey 2'); }'。你目前的措辞使得它听起来像你正在观察对象与功能的不同模式,但事实并非如此。 – apsillers

+0

我几乎在所有的编程语言中都发现一个常量,''='操作符只会修改它引用的变量(如实际引用“x”)而不是基础数据。如果一个类型具有'.modify()'或'.add()'方法,那么这是底层数据可以更改以便通过多个变量可见的一种方式。 – Katana314

+0

对不起 - 自我警告:在JavaScript中,'='用于修改对象的属性,当然可以被其他引用看到。例如:'var b = a; a.myprop = 3; console.log(b.myprop);' – Katana314

回答

5

JS中的一切都是按值传递其中对象和函数的值是引用。

这里发生的事情是将与对象发生(因为函数只是first-class objects)同样的事情:

这里是发生了什么事情的要点:

x = function() { console.log('hey 1'); } 

xfunction() that logs 1(为此功能创建内存)

y = x; 

yfunction() that logs 1(相同的内存位置)

x = function() { console.log('hey 2'); } 

x现在指向一个function() that logs 2(一个新的内存空间),没有什么影响y虽然

y; 

y仍指向同一function() that logs 1


如果你想有改变x影响y,你应该做的是改变他们指向的事情,不能改变什么他们指向

例如:

var pointingAtMe = { log: function() { console.log('1'); } } 
var x = pointingAtMe; 
var y = pointingAtMe; 

// change the actual thing x and y are both pointing to 
x.log = function() { console.log('2'); } // this line also sets `y.log` and `pointingAtMe.log`since they all point to the same thing 
// and the change gets applied to both 
y.log(); // logs '2' 
0

x = function() { console.log('hey 2'); }不改变x变量中包含的对象,而是修改x变量的内容。

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'被分配了一个全新的函数,当x改变时,是否有任何方法将变量'y'分配给新分配的函数?

不是,没有明确指定为y

相关问题