4

为了自我提升,我正在阅读(并重读)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;
            }
        );
    };
}()); 
4

2 回答 2

5

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

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

于 2012-05-13T10:31:46.737 回答
5

a不是数字偏移量,而是匹配的 substring

b(在这种情况下) 是第一个分组,即匹配减去周围的&and ;

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

于 2012-05-14T11:52:24.663 回答