重写传递给函数的对象

Overriding an object that was passed to a function

本文关键字:对象 函数 重写      更新时间:2023-09-26

我最近想知道这是否可能:将对象传递给函数并在该函数内部使用完全不同的对象覆盖整个对象,以便其值被永久修改。由于对象是通过引用传递的,我有一种感觉,它必须以某种方式工作,但我不知道如何。在代码中,它应该这样做:

function a() {
    console.log("i am a");
}
function b() {
    console.log("i am b");
}
function override(func1, func2) {
    func1 = func2;
}
override(a, b);
a(); //"i am b" expected

小提琴

这显然不起作用,因为我只是重写了变量func1,但我想你明白了。我选择使用函数而不是纯对象,因为您可以轻松地通过删除对象的属性并从第二个对象复制新属性来"覆盖"对象。但那不是我想要的。

在你问之前,我不是想用这个来解决任何现实生活中的问题,我只是好奇地问一下。那么有没有办法做到这一点,如果没有,有什么原因吗?

谢谢!

这不起作用,因为虽然JS传递对函数的引用,这仅仅意味着您的func1func2参数最终引用了标识符ab引用的相同函数(对象),但是当您更改func1引用的内容时,这并不影响a引用的内容。

换句话说,当你把一个对象传递给一个函数时,这个函数可以通过修改、添加或删除属性来改变对象的内容,但是它不能改变函数外部变量所指向的对象。(至少,不能通过函数自己的参数——函数可以修改其作用域链中的变量,直到并包括全局变量,但它必须通过引用它们自己的名称来完成。)

在你的代码中

function override(func1, func2) {
    func1 = func2;
}

func1是指向函数a的变量,func2是指向函数b的变量。语句func1 = func2使func1指向b,它不会改变函数override之外的任何内容。

请使用对象来使用通过引用传递。下面给出的代码说明了它是如何工作的。

function a() {
    console.log("i am a");
}
function b() {
    console.log("i am b");
}
var object1 = {
   func1:a
};
var object2 = {
   func2:b
}

function override(object1, object2) {
    object1.func1 = object2.func2;
}
override(object1, object2);
object1.func1(); //"i am b"

此代码仅用于演示,在实际场景中可能不会有用。