0

次のJavaScriptコードがあります:

var oLink = {
        title:   $link.attr('title') || '',
        row:     $link.attr('data-row') || '',
        $modal:  ''
    }

私は今、このような関数を呼び出します:

oLink.$modal = accessModalOpen(oLink, content);

oLink.$modal を返す必要がありますか、それとも accessModalOpen 内に設定できますか? 言い換えれば、パラメーター oLink は javascript で参照として渡されますか?

アップデート:

oLink 宣言に $modal を追加

4

6 に答える 6

3

現在の設定では、返却する必要があります。oLink 参照として渡されるため、関数内でも設定できますが、代わりに次のようになります。

accessModalOpen(oLink, content);

理解を深めるためのデモ

于 2012-09-20T05:58:36.387 に答える
2

「つまり、パラメーター oLink は javascript で参照として渡されますか?」

はい。関数内では、オブジェクトのコピーではなく、同じオブジェクトへの参照があるため、関数内でオブジェクト プロパティを更新、追加、および削除できます。

ただし、一部の言語にあるという意味での「参照渡し」ではないことに注意してください。関数外の変数と関数内で使用されるパラメーターは両方とも同じオブジェクトを参照します。そのため、そのプロパティを変更できますが、関数パラメーターを関数外の変数に影響を与えない他のオブジェクトに割り当てると元のオブジェクトを参照し続けます。

于 2012-09-20T06:25:09.897 に答える
1

次のいずれかを実行できます。

デモ

var $link = {
    attr:function(str) { return str; }
}

function accessModalOpen(obj,cont) {
    return "Modal: accessed "+obj.title+" with "+cont.text;
}    
function accessModalOpen1(obj,cont) {
    obj.$modal1= "Modal1: accessed "+obj.title+" with "+cont.text;
}    
var content = {
    text:"This is content"
}    
var oLink = {
  title:   $link.attr('object title') || '',
  row:     $link.attr('data-row') || ''
}

oLink.$modal = accessModalOpen(oLink, content); // return content and set
alert(oLink.$modal); 

accessModalOpen1(oLink, content); // just set
alert(oLink.$modal1); 
​
于 2012-09-20T06:11:19.460 に答える
1

助ける(または妨げる...後で説明します)ために、JSは非スカラーオブジェクトを参照で渡しますが、スカラーオブジェクトは値で渡します。

var x = 10;
function increment (num) { num += 1; }

increment(x);
console.log(x); // 10;

その間:

var bob = {
    name : "Bob",
    age : 32,
    job : "Shoe Salesman",
    salary : 2000000
};

function fire (employee) {
    delete employee.job;
    employee.unemployed = true;
    employee.salary = 0;
}

fire(bob); // { name : "Bob", age : 32, unemployed : true, salary : 0 }

したがって、オブジェクトまたは関数を関数に渡す場合は、プロパティを追加/変更できます。
配列を渡すと、アイテムを配列にプッシュしたり、配列からポップしたりできるようになります。

文字列、数値、またはブール値を渡す場合は、戻り値を使用する必要があります(ただし、オブジェクトを渡す場合は、そのプロパティの1つをスカラー値に変更できます)。

于 2012-09-20T06:20:21.203 に答える
1

この特定のケースではどちらも同じ結果になりますが、プロパティの実際のセマンティクスによって異なりoLink.$modalます。そのプロパティが のロジックと密接に結びついている場合は、内にaccessModalOpen設定する必要があります。を設定してはならない状況があっても、他の方法でその値が必要な場合は、それを返す必要があります。 accessModalOpenaccessModalOpen oLink.$modal

于 2012-09-20T06:05:52.377 に答える
0

すべての JavaScript パラメーターと同様に、oLink は関数accessModalOpenに値で渡されます。ただし、oLink 自体は、oLink オブジェクトのコンテンツが格納されているグローバル ヒープ内の場所への参照にすぎません。つまり、関数内から oLink のプロパティを変更でき、それらの変更は関数が戻った後も引き続き表示されます。

accessModalOpen 内でoLinkを新しいオブジェクトに再割り当てした場合、その変更は関数が返された後に表示されません。つまり、割り当てられていない場合、新しい oLink オブジェクトを作成するようなことはできません。

短い答えは、あなたが求めているように、関数内で oLink を変更できるということです。ただし、oLink が参照しているオブジェクトを変更する何かを行うと、それらの変更は関数が戻った後 (外側のスコープで) 破棄されることに注意してください。これを理解していないと、追跡が困難なバグにつながる可能性があります。

JavaScript がパラメーターの受け渡しをどのように処理するかについて、以下にリンクする、非常に優れた記事があります。これを強くお勧めします。正確に何が起こっているかについて、より詳細に説明します。

JavaScript パラメーターの受け渡し

于 2015-09-16T22:08:21.483 に答える