这段代码片段中的“回收”是什么意思?

时间:2017-06-10 13:02:07

标签: javascript

在MDN上,我找到了以下代码片段,评论说'回收同一个对象':

// recycling same object
function withValue(value) {
  var d = withValue.d || (
    withValue.d = {
      enumerable: false,
      writable: false,
      configurable: false,
      value: null
    }
  );
  d.value = value;
  return d;
}

有人可以使用简单的语言解释一下这段代码到底是做什么的吗?这对初学者来说并不那么明显。感谢。

源网址:enter link description here

此外,不要将d放在withValue函数本身上,为什么不把它放在withValue的原型上,如:

var d = withValue.prototype.d || ( ...

这里的主要考虑因素是什么?

2 个答案:

答案 0 :(得分:1)

第一次调用该函数时,它会创建一个新变量' d'并将其分配给自己。在OOP中,函数withValue将是类似的类,d就像一个静态成员。

console.log(withValue.d);    //undefined
var x = withValue(5);
console.log(x.value);    //5
console.log(withValue.d.value);    //5
console.log(x === withValue.d);    //true

变量x和变量withValue.d都是对同一对象的引用:

withValue.d.value = 1;
console.log(x.value);    //1

如果我再次调用withValue,它将回收或重用现有的静态成员(withValue.d)并更新其值:

var y = withValue(8);   
console.log(withValue.d.value, y.value, x.value);    //8 8 8
console.log(x === y,  x === withValue.d, y === withValue.d);    //true true true

更新:如果withValue是:

function withValue(value) {
  var d = {
    enumerable: false,
    writable: false,
    configurable: false,
    value: null
  };
  withValue.d = d;
  d.value = value;
  return d;
};

然后每次调用该函数都会创建一个新对象:

var x = withValue(1);
var y = withValue(2);
console.log(withValue.d.value, y.value, x.value);    //2 2 1
console.log(x === y,  x === withValue.d, y === withValue.d);    //false false true

y.value = 999;
console.log(withValue.d.value, y.value, x.value);    //999 999 1

现在创建了2个对象 - 一个由ywithValue.d引用,另一个由x引用。在第一种情况下,这三个变量正在访问同一个对象。

答案 1 :(得分:0)

它是一个辅助函数,用于定义用作db.fxh.update({ id: 456, 'pf.acc': { $elemMatch: { accid: 1494235749, cyc: { $elemMatch: { cycid: 1494404053 } } } } }, { $push: { 'pf.acc.$.cyc': { 'detail': { dcycid: 123461, status: "test" } } } } ) 工具的第三个参数的属性描述符对象。

在第一次运行时,它会为Object.defineProperty()函数分配一个默认私有属性,强制withValue添加一个不可枚举的不可变属性,不可写,不可配置且值为{传递给Object.defineProperty()函数。

以下代码;

withValue

将为var obj = {}; Object.defineProperty(obj, "newProp", withValue(10)); console.log(obj); // <- Object {newProp: 10} 分配一个名为obj的属性,该属性不可枚举,不可写且不可配置且值为10.