5

JavaScrit:TheGoodPartsのモジュール例をテストしています。function(a、b)で誰がaとbを渡すのかわかりません。どういうわけかそれは動作します。

Function.prototype.method = function(name, f) {
    this.prototype[name] = f;
    return this;
}
String.method('de', function() {
    var entity = {
        lt : '<',
        gt : '>'
    };
    return function() {
        return this.replace(/&([^&;]+);/g, function(a, b) {
            document.write("<br> a=" + a + " b=" + b);
            var r = entity[b];
            return typeof r === 'string' ? r : a;
        });
    };
}());
document.write("<br>" + '&lt;&gt'.de());
4

1 に答える 1

1

何が起こっているのかを理解するには、実際に何が行われているのかをよく見る必要があります。

Function.prototype.method = function(name, f) {
    this.prototype[name] = f;
    return this;
}

この部分はかなり明確です。任意のオブジェクトのプロトタイプを拡張するための「ショートカット」です。

魔法はコードの2番目の部分で発生します。以前に定義された関数には、2番目のパラメーターとして自己実行関数が付属しています。

String.method('de', function() {
    var entity = {
        lt : '<',
        gt : '>'
    };
    return function() {
        return this.replace(/&([^&;]+);/g, function(a, b) {
            // "this" will refer to the object the function is bound to.
            document.write("<br> a=" + a + " b=" + b);
            var r = entity[b];
            return typeof r === 'string' ? r : a;
        });
    };
}()); <-- The magic happens here!

つまり、JavaScriptインタープリターは、「firstinner」関数(に直接提供される関数)の戻り値をString.method実際の関数として使用します。これは、「firstinner」関数がに割り当てられる前に実行されるためString.prototypeです。

de以下のコードは同じことを行いますが、ローカルスコープにもう1つの変数( )を配置します。上記のアプローチはスコープを汚染しません。これを達成するためのよりエレガントな方法です。entityローカルスコープに入れてさらにラップを解除することもできます。

var de = function() {
    var entity = {
        lt : '<',
        gt : '>'
    };
    return function() {
        return this.replace(/&([^&;]+);/g, function(a, b) {
            // "this" will refer to the object the function is bound to.
            document.write("<br> a=" + a + " b=" + b);
            var r = entity[b];
            return typeof r === 'string' ? r : a;
        });
    };
};
String.method('de', de());

aさて、どのようにそして場に出るかについてのあなたの質問bに!これはString.replace、渡された2番目のパラメーターが関数である場合の動作に関連しています。コメントで提供されているリンクDCoderは、これをかなりよく説明しています。パラメータaは、一致したサブストリング全体でbあり、最初に一致した「括弧で囲まれたサブマッチ」です。

于 2012-10-27T08:42:44.253 に答える