1

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

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,但我认为你明白了。我选择使用函数而不是纯对象,因为您可以轻松地“覆盖”一个对象,只需删除它的属性并从第二个对象复制新属性。但这不是我想要的。

在你问之前,我并不是想用这个来解决任何现实生活中的问题,我只是出于好奇而问。那么有没有办法实现这一目标,如果没有,是否有理由不这样做?

谢谢!

4

2 回答 2

3

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

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

于 2013-06-08T11:28:11.357 回答
0

在您的代码中

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

func1是指向函数的变量,是指向函数afunc2变量b。该声明func1 = func2指向func1b。它不会改变函数之外的任何东西override

请使用对象来使用pass by reference。下面给出的代码说明了它是如何工作的。

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"

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

于 2013-06-08T11:34:43.947 回答