繁体   English   中英

Javascript:哪些参数传递给函数?

[英]Javascript: What parameters are being passed to function?

我试图将我的大脑包裹在封闭处。 我一直在阅读Javascript:The Good Parts,作者介绍了以下代码片段,用于向String对象添加“ deentityify”方法,该想法是对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的第二个参数的函数。 如何定义“ a”和“ b”?

直接调用“'.deentityify()没有明确传递任何参数,因此它们是如何定义的?作为一个次要的问题,为什么CONSOLE.LOG()用于记录的值不能工作和b?有什么办法我能否成功记录此类变量?

谢谢您的帮助。

编辑:最后一句话以前没有' not ',因此含义不清楚。

.replace()函数可以将函数作为第二个参数来调用。 这样做时,将在正则表达式成功匹配从匹配过程中提取的参数之后调用该函数。

第一个参数始终是源字符串的整个匹配部分。 后续参数表示来自正则表达式的“捕获组”。

在这种情况下,正则表达式为/&([^&;]+);/g 该字符与“&”号匹配,后跟“&”或分号以外的任意数量的字符,后跟一个分号。 前导“与”号和尾随的分号之间的字符被“捕获”,因为正则表达式的该部分带有括号。

因此,如果源字符串是

Hello &mdash; world!

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

  • &mdash; 作为整体匹配字符串
  • mdash作为第一个(在这种情况下,也是唯一一个)捕获组的值。

从而:

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

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

现在,最重要的是,问题中的代码涉及另一层有趣的行为。 实际上传递给method()函数的函数不是那个大的外部函数,而是从该函数返回的函数。 该返回的函数希望被调用,使得this是一个String实例; 否则,对this.replace()的调用将无法工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM