“在装饰器函数中设置的对象 属性 未按预期持续存在。”

'Object property set inside decorator function doesn't persist as expected.'

我学习使用 JavaScript 才 4 个月,所以如果有明显的遗漏,请告诉我。

这道题,我写了2个函数,

work = spy(work);
work(1, 2);
work.calls; // => [1, 2]

我关注了本文 'Custom Properties' 部分 Function Object。所以我希望函数对象 属性 (work.calls) 在我调用 spy(work) 后保留在工作对象中。

当我运行调试器下的代码时,我得到了一个st运行ge结果。

我尝试的解决方案如下所示:

function work(num1, num2) {
  return num1 + num2;
}

function spy(target) {
  target.calls = [];
  //set work.calls, work.calls is currently existing in debugger.
  
  function wrap(x, y) {
   
    target.calls.push([x, y]);
    
    return target(x, y);
  };
  
  
  return wrap
}

work = spy(work);

work(1, 2);
work.calls; // => now undefined in the debugger!

我发现的另一个解决方案建议将 target.calls 更改为 wrap.calls,它解决了问题。那么这是否意味着函数对象属性不是持久的,除非从它们自己的体内创建?

function spy(target) {
  
  
  function wrap(x, y) {
   
    wrap.calls.push([x, y]);
    //using wrap instead of target allows work.calls to be persistent 
    
    return target(x, y);
  };
  
  wrap.calls = [];
  
  return wrap
}

work = spy(work);

work(1, 2);

work.calls; // => [1, 2] all good in work.calls... but why?

我不明白为什么设置 wrap.calls 允许 属性 持续存在。对象不是总是在全局范围内持久化吗?

非常感谢您的耐心等待。我只是希望有人能帮助我理解这一点。

我建议首先避免 work = spy(work);。而是写

const spiedWork = 间谍(工作); …

然后比较调用work(1,2)和调用spiedWork(1,2)时发生的情况。还要比较 spiedWork.callswork.calls。一旦你弄清楚了这个(和那个spiedWork !== work),你就会明白原始代码中发生了什么。