大家都知道replace有两个参数,简单点说,第一个是要被替换的String(一般正则表达式),第二个是替换成的String,例如:var str="Visit Microsoft!"
(w3c上的例子第一个);
document.write(str.replace(/Microsoft/, "W3School"))
很多时候我们可能用到第二个参数要被规定为函数的情况(很常见,比如你要对匹配到的String进行一些类似截取什么的操作的时候),那么我们就需要知道这个函数的几个参数的定义,这里引用规定的内用容:
ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。>
解释一下:如:
正则:/&([^&;]+);/g 匹配的String:& lt;& quot; & qt;
function(a,b,c,d)
< lt 0 <">
" quot 4 <">
> gt 10 <">
这就是a,b,c,d对应的结果。
注意:当你的正则没有子表达式时(就是正则表达式中没有()),函数就相当于有三个参数了,b就没有了,调用的时候应该注意这一点。
最后,放一个《javaScript语言精粹》上的代码,加强一下理解,
这个代码本身是模块化的一个体现(函数+闭包)
String.prototype.box=function(){
var entity={
quot:'"',
lt:'<',
gt:'>'
};
return function(){
return this.replace(/&([^&;]+);/g,function(a,b,c,d){
//console.log(a,b,c,d)
var r=entity[b];
return typeof r==='string' ? r : a;
});
}
}();
document.writeln('<">'.box());
你可以在浏览器的控制台中用console.log(a,b,c,d)来看一下结果。