关闭的javascript问题

时间:2013-02-06 11:55:54

标签: javascript closures

给出以下代码:

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?我当然试过,输出是对的。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

参数(a&amp; b)的名称无关紧要,可以是您喜欢的任何名称。 第一个参数是匹配值,后续参数将是匹配组的值。因此,为了清楚起见,该函数可以写成:

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

引用MDN

  

要调用以创建新子字符串的函数(要放置   代替从参数#1接收的子字符串。争论   “指定功能”中描述了提供给此功能的功能   作为参数“以下部分。

答案 1 :(得分:1)

您可以将函数作为第二个参数切换到replace()。此函数充当某种回调函数,并按照Docs中所述的固定顺序从调用replace接收其参数。

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