为什么我的javascript参数没有通过“引用”传递?

时间:2013-04-17 12:55:00

标签: javascript

我确定我在这里遗漏了一些明显的东西,但我希望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 个答案:

答案 0 :(得分:11)

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

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

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

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

function changeMe(refToObject) {
    refToObject.Property1 = 'Value2';
}

答案 1 :(得分:3)

对象的引用作为参数值传递。但是:

refToObject = { Property1: 'Value2' };

此时您将丢失对refToObject以前引用的对象的引用,因为您要将此变量指定为引用其他对象。

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

答案 2 :(得分:0)

如果你熟悉C ++,这就等于做这样的事情:

void f(int* ref) {
    ref = new int(3);
}
int* a = new int(5);
f(a);
printf("%d",a); //Prints 5

答案 3 :(得分:0)

您正在尝试重新定义属性1,因此它无法正常工作。为了使用引用传递,ypu必须在 ChangeMe()函数中以refToObject.Property1='Value2'的方式执行此操作。请参阅此内容以便更好地理解Pass Variables by Reference in Javascript