1

このコード:

function CHANGE(d, cb){
    d.three = 3;
    d = {};
    console.log("d was changed into:");
    console.log(d);
    cb();
  }

  var d = { one: 1, two: 2 };
  CHANGE(d, function(){
    console.log("d after the callback is: ");
    console.log(d);
  });

d書き換えられているのでCHANGE()、本当は と表示{}されるはずdです。ただし、結果は奇妙です。

d was changed into:
{}
d after the callback is: 
{ one: 1, two: 2, three: 3 }

そのためd、プロパティthreeが追加されました。そして、それは大丈夫です。次に、空のオブジェクトが割り当てられました{}

どう考えたらいいのかわからない。

追加の属性をコールバック ( three) に追加しても問題ありません。次に、オブジェクトが書き換えられます。罰金。プリントアウトは、オブジェクトが実際に書き換えられたことを示しています。次に、コールバックで、余分なthree属性を持つオブジェクトが表示されます...?!?

変更されていないか、書き直されていれば、一貫性があります。でも…半分変わった…?

実際、これを示すためにコールバックを使用する必要はありません。これでも同じ問題があります:

function CHANGE( o ){
   o.three = 3;
   o = {};
 }

 var d = { one: 1, two: 2 };
 CHANGE(d);
 console.log("d after the function is: ");
 console.log(d);

ここdでも を含む完全なオブジェクトthreeです。では、オブジェクト参照を完全に変更することはできませんが、属性を変更できる特定の理由はありますか?

メルク。

4

2 に答える 2

1
d = {};

これにより、変数が新しいオブジェクトに再定義されるため、古い参照が失われます。これは、この時点以降、オリジナルが変更されていないことを意味します。

編集:

既存のオブジェクトのプロパティをクリアし、他のオブジェクトを再割り当てする場合は、次のように使用できます。

var a = {some:"stuff", other: "stuff"};

function clearProperties(obj) {
    for (var i in obj) {
         delete obj[i];
    }
}

console.log(a);
clearProperties(a);
a.newStuff = "stuff";
console.log(a);

出力:

Object {some: "stuff", other: "stuff"} fiddle.jshell.net:28
Object {newStuff: "stuff"} 

http://jsfiddle.net/2DxzT/

于 2013-02-03T02:39:04.653 に答える
1

パラメータを変更せずに引数を変更すると、(関数内の)引数が割り当てられているものだけが変更されます。

于 2013-02-03T02:40:29.163 に答える