4

John ResigBear BibeaultによるJavaScript Ninja の秘密を読んでいます。現在、クロージャに関する第 5 章まで読んでいます。クロージャーの一般的な要点と、私がよく知っている C++/Java のブロック スコープではなく、関数スコープで JavaScript がどのように動作するかを理解していると思います。私が完全に理解するのに苦労していることの1つは、目的を理解できるよりも多くの関数宣言がコードにあるように見えることがあります. たとえば、セクション 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();

私はこのコードのほとんどを理解しています。しかし、私が理解に苦しんでいるのは、2番目のメモ化関数で単純にできない理由です:

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 に答える