编程语言
首页 > 编程语言> > 为什么John Resig的JavaScript需要第二次关闭?

为什么John Resig的JavaScript需要第二次关闭?

作者:互联网

我在John ResigBear Bibeault阅读Secrets of the JavaScript Ninja,目前关于闭包的第5章.我认为有关闭的一般要点以及JavaScript如何使用函数作用域而不是我熟悉的C / Java块作用域.有一件事我无法完全理解,有时在代码中似乎有更多的函数声明,而不是我能想出的目的.例如,在第5.5.1节中,他介绍了自记忆功能,它基本上是一个记住计算值的函数,并将它们存储在缓存中,以便后续调用具有相同的输入.他给出了以下代码:

Function.prototype.memoized = function (key) {                    // #1
    this._values = this._values || {};
    xyz = this._values;
    return this._values[key] !== undefined ?
        this._values[key] :
        this._values[key] = this.apply(this, arguments);
};

Function.prototype.memoize = function () {                        // #2
    var fn = this;
    return function() {                                           // #2.1
        return fn.memoized.apply(fn, arguments);
    };
};

var isPrime = (function (num) {
    var prime = num !== 1;

    for (var i = 2; i < num; i++) {
        if (num % i === 0) {
            prime = false;
            break;
        }
    }

    return prime;
}).memoize();

我理解这段代码的大部分内容.但是我理解的是,为什么在第二个memoization函数不能简单地:

Function.prototype.memoize = function () {                      
    return this.memoized.apply(fn, arguments);
};

任何人都可以给我一个很好的解释,上面的代码中发生了什么,以及它与我在这里写的有什么不同?

解决方法:

有很大的不同:

return function() {
    return fn.memoized.apply(fn, arguments);
};

返回一个稍后可以调用的函数. memoized仅在调用函数时调用.

return this.memoized.apply(fn, arguments);

调用memoized函数并返回其返回值.

标签:javascript,closures,anonymous-function,memoization
来源: https://codeday.me/bug/20190629/1329198.html