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

该函数实际上是“替换”调用的参数。正则表达式匹配作为参数传递给函数。以另一种方式编写代码,它看起来:

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

您可以将函数作为第二个参数移交给replace(). 该函数充当某种回调函数,并replace以固定顺序从调用中接收它的参数,如Docs中所述。

a并且b只是任意名称 -a是匹配的子字符串和b捕获组([^&;])

于 2013-02-06T12:03:45.647 回答