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

はいといいえ。

「link の値を 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.value1

于 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参照するかを変更できることを意味します。しかし、上からわかるように、それらはできませんbarxおよびy参照しxているオブジェクトのプロパティのみを変更できますy

于 2012-11-12T13:18:12.950 に答える