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 回答