4

我正在阅读John ResigBear Bibeault 撰写的 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);
};

谁能给我一个很好的解释他上面的代码中发生了什么以及它与我在这里写的有什么不同?

4

1 回答 1

3

有很大的不同:

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

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

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

调用函数memoized并返回它的返回值

于 2013-01-28T21:03:03.940 回答