关闭JS以在函数中调用CB一次。 (试图解决练习。)

时间:2018-02-19 06:20:01

标签: javascript caching callback closures

好的,所以我的问题非常具体,因为我不只是随机学习JavaScript。我正在努力学习一门课程,所以我正在学习闭幕课程,而且我正在完成这项练习。我已经尝试过用几种方法编写代码,但是我仍然在指令的最后一位失败,指定只调用一次,就好像结果是25并且再次调用它,它看到它已经被5调用了一次,并且只剩下25。但是我被困住了。

以下是练习:

 function cacheFunction(cb) {
      // use closure to create a cache for the cb function
      // the function that you return should accept a single argument and invoke cb with that argument
      // when the function you return is invoked with an argument it should save that argument and its result
      // when the function you return is called again with an argument that it has seen before it should not call cb
      // but should instead directly returned the previous result
      // example:
      // cb -> function(x) { return x * x; }
      // if the function you return is invoked with 5 it would pass 5 to cb(5) and return 25
      // if the function you return is invoked again with 5 it will look on an object in the closure scope
      // and return 25 directly and will not invoke cb again

    --Code here
 }

现在这就是我所拥有的,而且它不起作用..

function cacheFunction(cb) {
    return function (number) {
      number + number;
      return cb(number);
    }
}

我知道还有更多内容和我写它的方式,这是不对的,但我还是新手,任何帮助都会受到赞赏。 :)

哦,我对它的JS测试说:

  

cacheFunction(CB)          √应该返回回调函数(1ms)          √应该在调用缓存函数时返回回调函数结果(1ms)          ×应缓存功能结果(4ms)

●cacheFunction(cb)>应该缓存函数结果

expect(jest.fn()).toHaveBeenCalledTimes(2)

Expected mock function to have been called two times, but it was called nine times.

  46 |              cachedFunction(10);
  47 |              cachedFunction(10);
> 48 |              expect(cb).toHaveBeenCalledTimes(2);
  49 |      });
  50 | });
  51 |

为什么要拨打9次?

1 个答案:

答案 0 :(得分:0)

根据运动要求,您需要memoization。在您的情况下简单定义:如果您已经使用相同的数字调用了缓存函数,请不要调用cb函数。我可以给你一个答案,但它不会帮助你学习JS。所以我会提供简单的提示。

  1. 您的回调是计算器,因此请在其中移动number + number
  2. 第二次创建商店以保存您的价值观。因此,如果已发送号码,则无需重新计算。想想商店的变量类型。
  3. 考虑首先检查商店,如果没有价值计算并存储价值。
  4. 关于为什么九次,我希望你明白,如果你缓存的函数会用相同的参数调用九次。它只需要调用一次cb函数