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

Nic*_*ick 4 javascript module function

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

...
return this.replace(...,
    function (a, b) {
       var r = ...
    }
);
Run Code Online (Sandbox Code Playgroud)

我想我明白了:

  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;
            }
        );
    };
}()); 
Run Code Online (Sandbox Code Playgroud)

phi*_*hag 5

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

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


Dav*_*ton 5

a不是数字偏移量,它是匹配的子字符串.

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

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