2011-01-21 7 views
0

オブジェクトが関数の引数として渡された場合、新しいインスタンスが作成されますか?このコードで

function myFunction(obj) { 
    console.log(obj); 
} 

var obj = { 
    key : 'value', 
    funct : function(){}, 
    elem : document.getElementById('navigation').getElementsByTagName('a') 
} 

myFunction(obj); 

は「OBJ」私が定義され、同じオブジェクトのMyFunction内のコンソールに印刷されたオブジェクトであるか、新しいインスタンスがありますか?

また、myFunctionから別の関数に渡すとどうなりますか?

+0

ありがとうございました!私は本当にこれを聞く必要があった。 – Sam3k

答えて

2

あなた自身で答えるのは簡単です。このコードを試して、何が起こるかを確認してください。

function Test(obj) { 
    obj.Whatever = "!"; 
} 

var testObj = { original: true }; 
Test(testObj); 
alert(testObj.Whatever); 

アラートに "undefined"と表示された場合は、関数に渡すときにコピーを作成しました。アラートに「!」と表示された場合は、オブジェクト自体(または参照、またはポインタ)を関数に渡しました。

私はかなりあなたが "!"

+0

私はあなたが警告(testObj.Whatever)を意味すると信じています。 hehe、正確に必要な証拠 – Sam3k

2

定義したオブジェクトと同じオブジェクトである必要があります。何回も渡しても、同じオブジェクトを継続します。どうして?あなたはこれがそうでないことを示す何かを見ていますか?

プリミティブ値は値渡しで、オブジェクトは参照渡しであるため、混乱するかもしれません。

これは、差のかなりまともな説明である:http://snook.ca/archives/javascript/javascript_pass

オチができる彼のコードの例である:

ここプリミティブ値、この場合は整数を扱う例です。プリミティブ値の場合、 プリミティブ値は値渡しされます。これは、値の新しいコピーが関数呼び出しでスタックに置かれることを意味します。また、関数内で値に加えられた変更は、その関数に対してローカルであることを意味します。

function myfunction(x) 
{ 
     // x is equal to 4 
     x = 5; 
     // x is now equal to 5 
} 

var x = 4; 
alert(x); // x is equal to 4 
myfunction(x); 
alert(x); // x is still equal to 4 

これは、参照渡しがどのように機能するかを示す例です。この場合、オブジェクトへの参照が関数に提供され、そのオブジェクトへの変更はその参照を持つすべての人に見られます。

function myobject() 
{ 
    this.value = 5; 
} 
var o = new myobject(); 
alert(o.value); // o.value = 5 
function objectchanger(fnc) 
{ 
    fnc.value = 6; 
} 
objectchanger(o); 
alert(o.value); // o.value is now equal to 6 

最後に、関数に渡された参照を新しい参照で置き換えると、この変更は関数の外部に反映されません。前の例をビルド:

function myobject() 
{ 
    this.value = 5; 
} 
var o = new myobject(); 


function objectchanger2(fnc) 
{ 
    function myObject2() 
    { 
     this.value = 10 
    } 
    fnc = new myObject2() 
} 

objectchanger(o); 
alert(o.value); // o.value is still 5 
+0

いいえ、スクリプトを最適化するだけです。 thx – Sam3k

1

私はjavascriptが参照渡しされると思うので、myFunctionは同じオブジェクトへの参照を参照します。

+1

それは値渡しですが、それが渡す値はオブジェクトへの参照です:-) – Pointy

+0

あなたは毎日何か新しいことを学びます。 – theninjagreg

2

同じオブジェクト、ではなく、の新しいインスタンスです。関数に渡されるものは、オブジェクトへの参照であり、オブジェクトのコピーではありません。 JavaScriptは純粋に値渡しの言語です。オブジェクトの関数に渡される(および変数などに保持される)値は、オブジェクト自体ではなく、の参照であるです。最初のアラートからを参照して、上記で

function foo(obj) { 
    alert(obj.prop1); 
    obj.prop2 = "foo"; 
} 
var thingy = { 
    prop1: 'bar' 
} 
foo(thingy); 
alert(thingy.prop2); 

Live example

:あなたはそれらの改造を見れば

あなたは容易に機能して、それを修正して見ることで、オブジェクトがコピーされていないことを証明することができますfooがのprop1プロパティを示している場合、が割り当てられたprop2を示す外部コードからのアラートが表示されます。

2

非プリミティブはすべてJavaScriptで参照渡しされます。つまり、それらは同じオブジェクトです。ただし、代わりにプリミティブが渡されます。

function change(a) { 
    a = 2; 
} 
var a = 1; 
change(a); 
alert(a); // should alert 1 

function change2(a) { 
    a.test = 2; 
} 
var obj = {test:1}; 
change2(obj); 
alert(obj.test); // should alert 2 
関連する問題