doubts on javascript apply - function memoization

后端 未结 2 860
抹茶落季
抹茶落季 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:09

    Let's use a simple example, fibonacci numbers.

    function fib(n) {
        if (n < 2) return 1;
        return fib.memoized(n-1) + fib.memoized(n-2);
    }
    

    Here we can see that the memoized method is applied on the fib function, i.e. your this keyword refers to the fib function. It does not relaunch the memoized function, but "launches" the function on which it was called. However, it does call it with this set to the function itself, which does not make any sense. Better:

    Function.prototype.memoize = function(key){
        if (!this._values)
            this._values = {};
        if (key in this._values)
            return this._values[key];
        else
            return this._values[key] = this.apply(null, arguments);
    // pass null here:                            ^^^^
    }
    

    Even better would be if memoized would return a closure:

    Function.prototype.memoized = function(v) {
        var fn = this, // the function on which "memoized" was called
            values = v || {};
        return function(key) {
            if (key in values)
                return values[key];
            else
                return values[key] = fn.apply(this, arguments);
        }
    }
    var fib = function(n) {
        if (n < 2) return 1;
        return fib(n-1) + fib(n-2);
    }.memoized();
    // or even
    var fib = function(n) { return fib(n-1) + fib(n-2) }.memoized({0:1, 1:1});
    

提交回复
热议问题