当函数创建并返回对象时会发生什么?

时间:2014-01-16 17:07:06

标签: javascript function object closures deep-copy

我有返回对象的函数:

function makeObject() {
  return { 
    property: "value"
  };
}

我可以像这样从中创建新的对象:

var newObject = makeObject();

我对此有一些疑问:

  1. newObject是否引用了函数返回的原始对象,还是具有自己属性的全新对象?

  2. 如果它是一个全新的对象,那么在某种意义上,它是否是函数返回的对象的深层复制

  3. 函数中的原始对象发生了什么变化?如果无法引用它,它是否在JavaScript运行时保持活动状态?

2 个答案:

答案 0 :(得分:4)

  1. 是(每次运行该函数时都会创建一个新对象,但该函数会返回该对象的引用)。您只能在JS变量中存储对象的引用。
  2. 不是。
  3. 函数内部对它的引用消失了。由于您将其分配给变量,因此您返回的对它的引用仍然可用。由于仍然存在可访问的引用,因此它仍然存在。
  4. 关于garbage collection的MDN文档是有用的相关阅读。

答案 1 :(得分:1)

这是一个等效函数:

function makeObj() {
  var o = new Object();
  o.property = 'value';
  return o;
}

对象文字语法实际上是上述的简写。

所以是的,它是一个全新的对象,不,它不是一个深层拷贝,因为没有什么可以复制的。每次调用函数时,它都会生成一个新对象。