【问题标题】:Javascript: What parameters are being passed to function?Javascript:传递给函数的参数是什么?
【发布时间】:2015-08-11 00:01:00
【问题描述】:

我正试图将我的大脑包裹在闭包上。我一直在阅读 Javascript: the Good Parts,作者提供了这段代码 sn-p 用于向 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() 用于记录值a 和 b?有什么方法可以成功记录这些变量?

感谢您的帮助。

编辑:'not' 以前从最后一句中丢失,导致含义不清楚。

【问题讨论】:

  • 试试"&amp;#123;".deentityify() - 只有当你在包含 HTML 实体的字符串上使用它时,该函数才会做任何有趣的事情。

标签: javascript methods parameters closures


【解决方案1】:

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

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

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

因此,如果源字符串是

Hello &mdash; world!

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

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

因此:

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

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

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

【讨论】:

  • 非常感谢!这现在更有意义了! w3schools 页面没有提到 second-parameter-as-a-function 语法....我仍然不明白,尽管我无法对这些变量中的任何一个执行 console.log() 。有什么特别的原因不起作用吗?
  • @rumdrums 好吧,如果正则表达式匹配某些内容,您只会进入该函数。尝试使用"Hi &amp;#32; there" 之类的字符串 - 您应该看到#32b 的值。
  • 你是对的——再次感谢您的帮助。
猜你喜欢
  • 2016-06-26
  • 2011-10-02
  • 2016-01-16
  • 1970-01-01
  • 2011-04-16
  • 2012-04-11
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多