Javascript:传递给函数的参数是什么?

时间:2015-08-11 00:01:00

标签: javascript methods parameters closures

我试图将我的大脑包裹在闭包之内。我一直在阅读Javascript:好的部分,作者提供了这段代码片段,用于添加' deentityify' String对象的方法,其思想是解码HTML编码符号:

// the method method:
Function.prototype.method = function(name, func) {
        if (! this.prototype[name]) {
                this.prototype[name] = func;
                return this;
        }
}

String.method('deentityify', function() {

        // entity table: maps entity names
        // to characters:
        var entity = {
                quot: '"',
                lt: '<',
                gt: '>',
        };

        // Return the deentityify method:
        return function() {
                return this.replace(/&([^&;]+);/g,
                        // What are a & b, how are they getting passed?!
                        function (a, b) {
                                //  console.log added by me, unsuccessfully:
                                console.log('a = ' + a);
                                console.log('b = ' + b);
                                var r = entity[b];
                                return typeof r === 'string' ? r : a;
                        }
                );
        };
}());

所以我理解这里发生的大部分内容,除了传递给定义为String.replace的第二个参数的函数的实际参数。如何&#39; a&#39;和&#39; b&#39;得到定义?

直接调用&#39;&#34;&#39; .deentityify()不会显式传递任何参数。那他们是如何定义的?作为第二个问题,为什么console.log()用于记录a和b的值?有什么办法可以成功记录这些变量吗?

感谢您的帮助。

编辑:&#39; &#39;以前在最后一句话中遗漏了,意思不明确。

1 个答案:

答案 0 :(得分:1)

可以使用函数作为第二个参数调用.replace()函数。执行此操作后,在正则表达式与从匹配过程中提取的参数成功匹配后,将调用该函数。

第一个参数始终是源字符串的整个匹配部分。后续参数代表&#34;捕获组&#34;来自正则表达式。

在这种情况下,正则表达式为/&([^&;]+);/g。它匹配一个&符号,后跟除了&符号或分号之外的任意数量的字符,后跟一个分号。主要&符号和尾随分号之间的字符被捕获&#34;因为正则表达式的那部分是带括号的。

因此,如果源字符串是

Hello &mdash; world!

然后匹配该正则表达式(一次)将产生:

  • &mdash;作为整体匹配字符串
  • mdash作为第一个(仅在此情况下)捕获的组的值。

因此:

"Hello &mdash; world!".replace(/&([^&;]+);/g, function(all, group) {
  alert("entire match: " + all + " group: " + group);
});

会根据我上面列出的内容显示一条消息。

现在,最重要的是,问题中的代码涉及另一层有趣的行为。 实际传递给method()函数的函数不是那么大的外部函数,而是从返回的函数。期望调用返回的函数,使this是一个String实例;否则,拨打this.replace()的电话无法正常工作。