【问题标题】:Why is this second closure needed in John Resig's JavaScript?为什么 John Resig 的 JavaScript 需要第二个闭包?
【发布时间】:2013-01-12 07:54:07
【问题描述】:

我正在阅读 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);
};

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

【问题讨论】:

  • 因为这会根据函数调用上下文而变化。
  • 别忘了 Bear Bibeault!
  • 这是一种简单的柯里化形式。来自 John Resig 本人:ejohn.org/blog/partial-functions-in-javascript
  • 我有一个问题,num参数在#2中是不可见的,但在#2.1中是可见的?

标签: javascript closures anonymous-function memoization


【解决方案1】:

有很大的不同:

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

返回一个您可以稍后调用的函数memoized 只有在函数被调用时才会被调用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2010-09-27
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2017-06-01
    • 2011-04-18
    相关资源
    最近更新 更多