3

クロックフォードの「JS: The Good Parts」を読んでいます。彼はこれを使用した 2 つの例を持っていthisますthat

最初の例:

String.method('deentify', function() {
    var entity = {
        quot:   '"',
        lt:     '<',
        gt:     '<'
    };

    return function() {
        return this.replace(/&([^&;]+);/g,
            function (a, b) {
                var r = entity[b];
                return typeof r === 'string' ? r : a;
            }
        );
    };
}());
document.writeln('&lt;&quot;&gt;'.deentify()); 

2 番目の例:

Function.method('curry', function() {
    var args = arguments, that = this;
    return function () {
        return that.apply(null, args.concat(arguments));
    };
});
var add1 = add.curry(1);
document.writeln(add1(6));

this最初の例で直接アクセスできるのはなぜですか? その例とそれに続く例の違いは何ですか?

4

1 に答える 1

3

を行うobj.f()と、this関数内でfを参照しobjます。

最初の例でdeentify()は、は文字列で呼び出されます。その関数では、関数が呼び出されたオブジェクトである文字列のみが必要です。文字列はthis、関数内でdeentify()参照されるものです。

なぜ必要なのかthat

関数は、元の関数への参照を何らかのadd1方法で保存する必要があります。として呼び出されないため、を使用できません。これは、(例では)実行する関数への参照を保存するクロージャーを作成することで克服されます。addadd1thisadd.add1thatcurry()add()

を呼び出すとadd.curry()、関数thisを参照しaddます。(あなたが呼んだのでcurry()add。カレー関数内のクロージャにより、thatはその値を保持し、が呼び出されたaddときに関数を参照します。add1()

thisから返された関数内で使用された場合curry()、オブジェクトを参照しwindowます。

Function.method('curry', function() {
    var args = arguments, 
      that = this; //reference to add
    return function () {
        //`apply` calls add
        return that.apply(null, args.concat(arguments)); 
    };
});
var add1 = add.curry(1);
document.writeln(add1(6));

return:最初のスニペットの最初のスニペットは関数を示し、2番目のスニペットの最初 スニペットは関数の戻り値示していることを確認することが重要です。deentify()returncurry()

argumentsカレーが効く/魔法も知りたい方apply()はコメント欄でお尋ねください。詳しく説明させていただきます。

于 2012-08-05T08:39:31.350 に答える