3

私は、この「引数の受け渡し」という考えに頭を悩ませようとしています。私が読んでいる本では、引数は参照ではなく値によってのみ渡されると述べています。

function addTen(num) { 
   num + = 10;
   return num; 
} 


var count = 20; 
var result = addTen(count); 
alert(count); // 20 - no change 
alert(result); // 30

上記の例は非常に明確ですが、以下の例では非常に混乱します。

person を setName 関数に渡すと、ローカル変数 'obj' をミラーリングして関数内のステートメントを流していませんか? つまり、人は最初にプロパティ名に設定され、次に新しいオブジェクトに割り当てられ、最後にこの新しく作成された人オブジェクトにプロパティ「グレッグ」が割り当てられます????

なぜ「ニコラス」を手に入れるのですか!!!!

function setName(obj) {
    obj.name = "Nicholas"; 
    obj = new Object(); 
    obj.name = "Greg"; 
}        

var person = new Object(); 
setName(person); 
alert(person.name); //" Nicholas"
4

5 に答える 5

3

オブジェクトは、参照のコピーとして関数に渡されます。あなたの例で何が起こるかは次のとおりです:

var person = new Object();     

function setName(obj) { // a local obj* is created, it contains a copy of the reference to the original person object
    obj.name = "Nicholas"; // creates a new property to the original obj, since obj here has a reference to the original obj
    obj = new Object(); // assigns a new object to the local obj, obj is not referring to the original obj anymore
    obj.name = "Greg"; // creates a new property to the local obj
}

setName(person);
alert( person.name); //" Nicholas"

*=objは、元の値への参照であるを含むローカル変数です。後でローカル変数のを変更しても、元のオブジェクトには反映されません。obj

于 2013-07-06T13:42:58.220 に答える
2

"Nicholas"JavaScript が「参照による」ことはないため、正確に取得できます。personそうであれば、任意の場所から変数を更新できます。そうではないためnew Object()、関数内の は外部person変数を変更しません。

ただし、変数がオブジェクト自体を参照するわけではありませんが、変数は、メモリに直接アクセスせずにオブジェクトを更新できる特別なタイプの参照を保持します。

そのため、JavaScript は常に「値渡し」ですが、オブジェクトの完全なコピーを取得することはありません。その特別な参照のコピーを取得しているだけです。その結果、参照のコピーを介して渡された元のオブジェクトを操作できますが、参照を介して実際に置き換えることはできません。

于 2013-07-06T13:40:40.207 に答える
2

JavaScript ではすべてが値渡しです。何かを引数として渡すと、JS はそのコピーを作成して関数に送信します。オブジェクトが渡されると、JS はそのオブジェクトの参照を別の変数にコピーし、そのコピーされた変数を関数に渡します。渡された変数はまだオブジェクトを指しているので、. または[]表記。しかしnew、新しいオブジェクトを定義するために使用する場合、その変数は単に新しい参照を指します。

function setName(obj) {
    obj.name = "Nicholas"; // obj pointing to person reference
    obj = new Object();  // obj now pointing to another reference
    obj.name = "Greg"; // you have changed the new reference not person reference
}        

var person = new Object(); // person pointing to person reference
setName(person); 
alert( person.name); //" Nicholas"
于 2013-07-06T13:49:08.497 に答える
1

パラメーターは値で渡されます。オブジェクトの場合、値はオブジェクトへの参照のコピーであることを意味します。

これは、単純な代入を行う場合と同じです。これも値によるものです。

// a variable that contains a reference to an object:
var person = new Object();
// another variable, that gets a reference to the same object:
var people = person;
// a function call with a reference to the object:
setName(person);

関数では、パラメーターは、参照を関数に送信するために使用される変数とは無関係に機能するローカル変数ですが、同じオブジェクトを参照します。

function setName(obj) {
  // as the variable references the original object, it changes the object:
  obj.name = "Nicholas";
  // now the variable gets a reference to a new object
  obj = new Object();
  // the new object is changed
  obj.name = "Greg";
}
于 2013-07-06T13:51:08.787 に答える
0

参照渡しは次のことを意味します。

function a(obj) {
    obj = 3;
}

var test = new Object();
a(test);
console.log(test); //3, so I have lost the object forever

IE でさえ、変数の割り当てが呼び出し元に表示されます。

もちろん、ターゲット関数が渡されたオブジェクトを変更する場合、オブジェクト自体への変更は呼び出し元に表示されます。

于 2013-07-06T13:41:13.727 に答える