我最近想知道这是否可行:将一个对象传递给一个函数,并用该函数内部的一个完全不同的对象覆盖整个对象,以便永久修改它的值。由于对象是通过引用传递的,我觉得它必须以某种方式工作,但我不知道如何。要把它放在代码中,它应该做这样的事情:
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
,但我认为你明白了。我选择使用函数而不是纯对象,因为您可以通过删除其属性并从第二个对象复制新属性来轻松“覆盖”对象。但那不是我想要的。
在你问之前,我并不想用这个来解决任何现实生活中的问题,我只是出于好奇而问。那么有没有办法实现这一目标,如果没有,是否有理由不这样做?
谢谢!
答案 0 :(得分:3)
这不起作用,因为虽然JS传递对函数的引用,但这意味着您的func1
和func2
参数最终引用标识符a
的相同函数(对象)并b
引用,但是当您更改func1
引用的内容时,a
不会影响{{1}}引用的内容。
换句话说,当您将对象传递给函数时,函数可以通过修改,添加或删除属性来更改对象的内容,但它不能更改函数外部的变量引用的对象。 (至少,不是通过函数自己的参数 - 函数可以修改其范围链中的变量,直到并包括全局变量,但它必须通过自己的名称引用它们来实现。)
答案 1 :(得分:0)
在您的代码中
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"
此代码仅用于演示,可能在实际情况下无用。