给出以下代码:
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;
}
);
};
}());
document.write('deentityify: ' + '<">'.deentityify() + '<br>');
关于
function (a, b) {
var r = entity[b];
return typeof r === 'string' ? r : a;
}
为什么匿名函数获取参数值a,b?我当然试过,输出是对的。任何人都可以帮助我吗?
答案 0 :(得分:3)
该函数实际上是'replace'调用的参数。正则表达式匹配作为参数传递给函数。 要以另一种方式编写代码,它看起来会是:
function match(a, b) {
var r = entity[b];
return typeof r === 'string' ? r : a;
}
var result = this.replace(/&([^&;]);/g, match)
参数(a&amp; b)的名称无关紧要,可以是您喜欢的任何名称。 第一个参数是匹配值,后续参数将是匹配组的值。因此,为了清楚起见,该函数可以写成:
function matchFn(match, group1, group2, group3) {
var r = entity[group1];
return typeof r === 'string' ? r : match;
}
引用MDN
要调用以创建新子字符串的函数(要放置 代替从参数#1接收的子字符串。争论 “指定功能”中描述了提供给此功能的功能 作为参数“以下部分。
答案 1 :(得分:1)
您可以将函数作为第二个参数切换到replace()
。此函数充当某种回调函数,并按照Docs中所述的固定顺序从调用replace
接收其参数。
a
和b
只是任意名称 - a
是匹配的子字符串,b
是捕获组([^&;])
。