1

我有一个看起来像下面的函数的函数。它接受一个名为 的对象 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 函数中使用?

4

3 回答 3

3

是的,没有。

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

不。

“我在 checkParams(link: Link) 函数中所做的更改是否可用于链接对象,以便它们可以在 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则将被函数中创建的新对象替换,并且b.value将是1.

于 2012-11-12T13:33:33.463 回答
1

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

简单测试:

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

示范

回答评论:数组是对象,它的工作原理是一样的

在这种精确的情况下,您可能会将传递模式视为“通过引用传递”,但这只是使用另一种语言的一些词汇:您传递变量的值,对象的变量值是它们的引用。这个词汇的问题体现在 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 中那样传递对原始变量的引用。

于 2012-11-12T13:16:14.343 回答
-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引用的对象的属性,x而不能更改它们y本身。

于 2012-11-12T13:18:12.950 回答