为什么在 John Resig 的 JavaScript 中需要第二个闭包?



我正在阅读John ResigBear BibeaultSecrets 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();

我理解大部分代码。然而,我难以理解的是为什么在第二个记忆功能不能简单地是:

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并返回其返回值

最新更新