当我将对象传递给JavaScript函数时,该对象是否通过引用传递?

时间:2012-11-12 13:15:23

标签: javascript jquery typescript

我有一个看起来像下面这个功能的功能。它需要一个名为的对象 link,调用getAdminParams,然后使用该调用的返回值 更改链接对象中的属性:

function checkParams(link: Link) {
    var rtn : IAdminParams = null,
        table = null;
    if (link.Action === "Create") {
        if (link.Params == null) {
            rtn = getAdminParams(link.Entity);
            if (rtn.Success) {
                link.Url = link.Href + rtn.Param;
                table = rtn.Table;
            } else {
                link.$Link.prop('disabled', false);
                return;
            }
        } else {
            link.Url = link.Href + link.Params;
            table = link.Entity;
        }
    } else {
        link.Url = link.Href;
    }
}

我正在调用以下函数。

function adminDialog($link: JQuery) {
    var link = new Link($link);
    checkParams(link);
    doDialogAjax(link);
}

当我将链接值传递给checkParams(link)时,它将被传递 参考?换句话说,我将在checkParams(link: Link)中进行更改 函数可用于链接对象,因此可以在doDialogAjax中使用它们 功能

3 个答案:

答案 0 :(得分:3)

是的,没有。

  

“当我将链接值传递给checkParams(链接)时,它会是   通过引用传递?“

没有

  

“我将在checkParams中进行更改(链接:链接)   函数可用于链接对象,因此它们可以在   doDialogAjax功能?“

该变量未通过引用传递。它是按值传递的,但该值是参考值。

如果变量是通过引用传递的,则该函数可以更改变量。这不会发生:

function change(obj) {
  // change the object
  obj.value = 42;
  // replace it with a new object
  obj = { value: 1 };
}

// create an object
var a = { value: 0 };

// create another variable, to use in the call to the function
var b = a;

change(b);

alert(a.value); // shows 42, as the function changes the object passed in
alert(b.value); // shows 42, not 1, as the variable b is not changed by the function

演示:http://jsfiddle.net/sCJHu/

如果变量是通过引用传递的,b将被函数中的新对象create替换,而b.value将是1

答案 1 :(得分:1)

是的,您在接收对象的函数中所做的更改在对象的其他用途中可见。

简单测试:

​function increment(obj) {
    obj.a++;    
}
var myobj = {a:3};
increment(myobj);
document.write(myobj.a); // prints 4

Demonstration

回答评论:数组是对象,而works the same

在这种精确的情况下,您可能会看到传递模式为“按引用传递”,但这只是使用另一种语言的一些词汇:您传递变量和变量值的值对象是他们的参考。 Archer的错误就是这个词汇表的问题:你无法替换变量的值:

​function increment(obj) {
    obj = {a:4}; // doesn't change the passed object, just the local variable obj
}
var myobj = {a:3};
increment(myobj);
document.write(myobj.a); // prints 3 because myobj isn't changed

换句话说:一个函数可以修改一个对象,该对象是传递给它的外部变量的值,它不能替换它。因为您没有像在C中那样传递对原始变量的引用。

答案 2 :(得分:-1)

  

当我将对象传递给javascript函数时,该对象是否通过引用传递?

对象的引用传递给函数(这是“通过引用传递”,这完全是另一回事)。一个更简单的例子有助于说明这一点:

function foo(o1) {
    console.log("foo1: o1.a = " + o1.a);
    o1.a = "updated";    // <=== MODIFYING the object
    console.log("foo2: o1.a = " + o1.a);
}
function bar(o2) {
    console.log("bar1: o2.a = " + o2.a);
    o2 = {a: "updated"}; // <=== Pointing to a DIFFERENT object (no effect outside function)
    console.log("bar2: o2.a = " + o2.a);
}

var x = {a: "original x"};
foo(x);           // Logs "foo1: o1.a = original x",
                  // then "foo2: o1.a = updated"
console.log(x.a); // Logs "updated"

var y = {a: "original y"};
bar(y);           // Logs "bar1: o2.a = original y",
                  // then "bar2: o2.a = updated"
console.log(y.a); // Logs "original y", *NOT* "updated"

请注意,这是按值传递;与对象有关的值是对象引用。你可能会看到人们称之为“通过参考传递”,但这根本就是错误的。如果变量是“按引用传递”,则表示您可以在调用代码中更改变量的值。例如,这意味着我们的功能可以改变xy所指的内容。但正如我们从bar上面所看到的那样,它们不能。它们只能更改xy引用的对象的属性,而不能更改xy自身的属性。