1

我确定我在这里遗漏了一些明显的东西,但我希望 changeMe 方法的参数“通过引用”传递 - 换句话说,对函数内部参数的更改将更改函数外部的变量.

以下是在 jsfiddle 中运行的,使用 Chrome 的 F12 开发人员工具来显示控制台输出。http://jsfiddle.net/fzEpa/

var object1 = { Property1: 'Value1' };
changeMe(object1);
console.log(object1);

function changeMe(refToObject) {
    console.log(refToObject);
    refToObject = { Property1: 'Value2' };
    console.log(refToObject);
}
4

4 回答 4

11

它是通过引用传递的,但它是对对象的引用,而不是对object1变量的引用(这也是对对象的引用)。

您正在用对新对象的引用覆盖对对象的引用。

这使对原始对象的原始引用保持不变。

要修改对象,您可以执行以下操作:

function changeMe(refToObject) {
    refToObject.Property1 = 'Value2';
}
于 2013-04-17T12:56:10.123 回答
3

对对象的引用作为参数值传递。然而:

refToObject = { Property1: 'Value2' };

此时,您将失去对以前引用的对象的引用,refToObject因为您正在分配此变量以引用不同的对象。

现在,如果您要编辑refToObject的属性而不是丢弃以前的对象引用,您的代码将按预期工作(如@Quentin 的回答中首先解释的那样)。

于 2013-04-17T12:56:45.350 回答
0

如果您熟悉 C++,这将等同于执行以下操作:

void f(int* ref) {
    ref = new int(3);
}
int* a = new int(5);
f(a);
printf("%d",a); //Prints 5
于 2013-04-17T13:01:01.543 回答
0

您正在尝试重新定义属性 1,因此它不起作用。为了使用通过引用传递,ypu 必须refToObject.Property1='Value2'ChangeMe()函数中以这种方式进行。参考this以更好地理解在Javascript中通过引用传递变量

于 2013-04-17T13:03:45.407 回答