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

Functions in js copied/passed by value or reference

本文关键字:js 传递 函数 复制 引用      更新时间:2023-09-26

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

我正在尝试这个代码,突然发现了一些令人困惑的东西。以下是代码片段:

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"有没有办法分配给新分配的函数?

JS中的所有内容都是传递值,其中对象和函数的值是引用。

这里发生的事情与对象发生的事情相同(因为函数只是一级对象):

以下是发生的事情的要点:

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,您应该做的是更改它们所指向的东西,而不是更改它们所指的东西。

例如:

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'

如果像对象这样的函数是通过引用复制/传递的,为什么y没有更新为打印"嘿2"?

你在做错误的假设。在JavaScript中,一切都是通过值传递的。对象被表示为引用是正确的,但这与逐引用传递不同。

即使你使用了一个普通的对象而不是函数,你也看不到你所期望的:

var x = {foo: 42};
var y = x;
x = {foo: 21};
console.log(y.foo); // still 42

传递值/引用仅描述如何解析变量参数,与变量的值无关。

如果这种行为是因为"x"被分配了一个全新的函数,那么当x发生变化时,变量"y"有没有办法分配给新分配的函数?

没有。没有明确分配给y

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