doubts on javascript apply - function memoization

后端 未结 2 858
抹茶落季
抹茶落季 2020-12-12 01:30

I\'m struggling with an example of js memoization found on a book, here\'s the code:

Function.prototype.memoized = function(key){
    this._values = this._va         


        
2条回答
  •  鱼传尺愫
    2020-12-12 02:23

    Notes

    1. Since you are attaching memoized to the Function.prototype, you can invoke this memoized on some other function only. Like in your example

      isPrime.memoized(5)
      
    2. Since you are invoking memoized on a function, the this will be referring to the function on which the memoized is invoked. So, in this case, this refers to isPrime.


    Actual explanation

    this._values = this._values || {};
    

    This line makes sure that the isPrime has got an attribute with the name _values and it should have an empty object, if it is not there already.

    this._values[key] !== undefined
    

    This check is to make sure that we have been already called with key or not. If the value is not undefined, then return this._values[key].

    Otherwise,

    this._values[key] = this.apply(this, arguments)
    

    store the result of calling this.apply(this, arguments) in this._values[key] and return it. Now the important part.

    this.apply(this, arguments)
    

    It is straight forward. arguments is an array like object. So, If you have actually called isPrime like this isPrime(1, 2, 3, 4), arguments will have {'0': 1, '1': 2, '2': 3, '3': 4}. Now that we are inside memoized, we need to invoke isPrime as it was intended to be invoked. So, this.apply(this, arguments) is done. Function.prototype.apply, tries to spread the array like object passed as the second parameter, while invoking the function.

提交回复
热议问题