Crockford的深化方法 - The Good Parts的第41页

时间:2012-05-13 10:25:49

标签: javascript function module

在自我改进方面,我正在阅读(并重读)SeñorCrockford的TGP。但是,我不能理解他的深化方法的最中间部分。

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

我想我理解:

  1. this.replace传递两个参数,正则表达式作为搜索值和生成替换值的函数;
  2. b用于访问实体对象中的属性;
  3. return ? r : a;位确定是按原样返回文本还是返回实体中相应属性的值。
  4. 我根本没有得到的是a& amp; b作为function (a, b)的参数提供。什么叫这个功能? (我知道整个事情都是自动执行的,但这对我来说并不是很清楚。我想我在问这个函数是如何被调用的?)

    如果某人有兴趣通过类似于this的打击分析进行打击,我会非常感激,我怀疑其他人也可能。

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

a不是数字偏移量,而是matched substring

b(在本例中)是第一个分组,即匹配减去周围的&;

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