克罗克福德的去实体化方法 - 《好部分》第41页

Crockford's deentityify method - p.41 of The Good Parts

本文关键字:好部分 41页 方法 实体化 克罗      更新时间:2023-09-26

为了自我完善,我正在阅读(并重读(Señor Crockford的TGP。然而,我无法理解他的去实体化方法的最中间部分。

...
return this.replace(...,
    function (a, b) {
       var r = ...
    }
);

我想我明白:

  1. this.replace 传递了两个参数,正则表达式作为搜索值和函数生成替换值;
  2. B 用于访问实体对象中的属性;
  3. 返回? r : a;位确定是按原样返回文本,还是返回实体中相应属性的值。

我完全没有得到的是a和b是如何作为参数提供给function (a, b)的。调用此函数的是什么?(我知道整个事情都是自我执行的,但这并没有真正为我澄清它。我想我在问这个函数是如何调用的?

如果有人有兴趣进行类似的逐一分析,我真的很感激,我怀疑其他人也可能。

为方便起见,以下是代码:

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;
            }
        );
    };
}()); 
a不是

数字偏移量,而是匹配的子字符串。

b(在这种情况下(是第一个分组,即比赛减去周围的&;

该方法检查以确保实体存在,并且它是一个字符串。如果是,那就是替换值,否则由原始值替换,减去&;

replace函数可以将函数作为第二个参数。

然后为每个匹配项调用此函数,其签名取决于要搜索的正则表达式中的组数。如果正则表达式不包含任何捕获组,则a将是匹配的子字符串,b整个字符串中的数字偏移量。有关更多详细信息,请参阅 MDN 文档。