0

次のコードがあるとします。

String.method('deentityify', 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.write('deentityify: ' + '&lt;&quot;&gt;'.deentityify() + '<br>');

について

function (a, b) {
    var r = entity[b];
    return typeof r === 'string' ? r : a;
}

無名関数がパラメータ値 a、b を取得するのはなぜですか? もちろん試してみましたが、出力は正しいです。誰でも私を助けることができますか?

4

2 に答える 2

3

この関数は、実際には「replace」呼び出しの引数です。正規表現の一致は、パラメーターとして関数に渡されます。コードを別の方法で記述すると、次のようになります。

function match(a, b) {
    var r = entity[b];
    return typeof r === 'string' ? r : a;
}

var result = this.replace(/&([^&;]);/g, match)

パラメータの名前 (a と b) は重要ではなく、好きな名前を付けることができます。最初のパラメーターは一致した値になり、後続のパラメーターは一致したグループの値になります。したがって、わかりやすくするために、関数は次のように記述できます。

function matchFn(match, group1, group2, group3) {
    var r = entity[group1];
    return typeof r === 'string' ? r : match;
}

MDNを引用するには

新しい部分文字列を作成するために呼び出される関数 (パラメーター #1 から受け取った部分文字列の代わりに配置するため)。この関数に提供される引数については、以下の「関数をパラメーターとして指定する」セクションで説明します。

于 2013-02-06T12:02:43.323 に答える
1

関数を の 2 番目のパラメーターとして渡すことができますreplace()。この関数は、ある種のコールバック関数として機能し、 Docsreplaceに記載されているように、呼び出し元からそのパラメーターを一定の順序で受け取ります。

abは単なる任意の名前です -aは一致した部分文字列とbキャプチャ グループ([^&;])です。

于 2013-02-06T12:03:45.647 に答える