javascriptのオブジェクトは参照によって渡されますか?はいの場合、なぜこのコードが機能しないのか。
function change(myObj)
{
myObj={};
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 1
しかし、私がするとき
function change(myObj)
{
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 2
javascriptのオブジェクトは参照によって渡されますか?はいの場合、なぜこのコードが機能しないのか。
function change(myObj)
{
myObj={};
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 1
しかし、私がするとき
function change(myObj)
{
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 2
オブジェクトへの参照はメソッドに渡されます。最初の例では、参照が指すオブジェクトを変更しようとするのではなく、別のオブジェクトを指すように参照を変更しているため、変更はそのメソッドの外では見えません。
2 番目の例では、参照によって示されるオブジェクトの状態を変更しているmyobj
ため、メソッドの外部に表示されます。
まず、グローバル変数 o を、値 = 1 の属性変数 a を持つ新しい匿名オブジェクトの参照に設定します
o={a:1};
。このオブジェクト {a:1} を '1A' と名付けます。
change(o);
次に、関数変更と JavaScript チェックを呼び出します。 typeof変数oとそれは「オブジェクト」です
実際には「オブジェクトを指す参照」である必要があるため、オブジェクト{a:1}の参照は関数の変更に渡されます変数がプリミティブである場合、値によってのみ渡されます
function change(myObj){
関数が変更され、デフォルトで typeof 'undefined' の変数 myObj が作成され、次に 'object' に変更されました。これは、参照パラメーターを取得したためです。変数 myObj は、オブジェクト '1A' => {a:1} および myObj を指す参照変数です。関数の変更とグローバル変数でのみ表示されます o おそらくオブジェクト '1A' => {a:1} を指している可能性があり
myObj={};
ます参照変数 myObj は、新しい匿名の空のオブジェクトを指しています {} このオブジェクトに「2B」という名前を付けます
myObj.a=2;
}
ここで、参照 myObj を使用してオブジェクト '2B' => {} を設定し、値 = 2 の新しい属性 a を設定し、グローバルがオブジェクト '2B' => {a:2}
alert(o.a); //alert 1
変数を参照できないことを意味する関数のスコープを終了します。オブジェクト {a:1} へのポイントまたはポイントである可能性があります。
オブジェクト '2B' => {a:2} は関数の変更の外では見ることができず
、ガベージ コレクションによって破棄されるため、参照 o はポイントを失うことはありません参照が失われ、
オブジェクト '1A' => {a:1} がガベージ コレクションによって破棄されない
ため、変数 o がまだそれを指しているため、o を呼び出す理由 オブジェクト '1A' => {a:1} を受け取る
文法が下手で申し訳ありませんが、読みやすくするために最善を尽くします。
この場合、実際のオブジェクトへの参照を上書きしています。
function change(myObj)
{
myObj={}; //overwriting the reference in myObj here.
myObj.a=2;
}
o={a:1};
change(o);
alert(o.a); //alert 1
次のように考えてください。
function change(myObj = referenceToObjectPassedIn)
myObj = new Object() ;
// referenceToObjectPassedIn lost in limbo
myObject.a = 2; //modifying newly created object.
問題を解決するには、新しいオブジェクトを返す必要があります。
例 1 では、myObj が参照するものを変更したため、意図したものとは異なるオブジェクトを変更することになります。いつ
alert(o.a);
が実行され、oa はオブジェクト宣言から変更されていないため、1 が返されます。それが少し役立つことを願っています。また、これを読むと、いくつかの問題が解決するはずです。私が最初に JavaScript を学んでいたときに助けてくれました: http://www.snook.ca/archives/javascript/javascript_pass/。