今天遇到一个需求,要使用replace调用回调函数,但是回调方法太长,要对它进行封装后进行调用,具体调用方法如下(示例):
function strHandle(a, b) {
return b.replace(/baidu.com/g, "dvy.com.cn")
}
var tmp = '网址:https://www.baidu.com'
var str = tmp.replace(/https\:\/\/([a-z\.]*)/g, function (map, $1) {
console.log(map) // https://www.baidu.com
console.log($1) // www.baidu.com
return strHandle(map, $1)
});
console.log(str) // 网址:www.dvy.com.cn
经过测试上述代码,replace调用外部方法作为回调函数的另一写法如下
function strHandle(a, b) {
console.log(a)
console.log(b)
return b.replace(/baidu.com/g, "dvy.com.cn")
}
var tmp = '网址:https://www.baidu.com'
var str = tmp.replace(/https\:\/\/([a-z\.]*)/g, strHandle);
// 说明:这里strHanle不需要写参数,他直接会传入map,$1,$2,$3....这里的map是匹配到的整个字段,$1,$2,$3这里是()匹配到的字段段
console.log(str) // 网址:www.dvy.com.cn
另附注一下错误的调用写法
// 错误写法:无法通过直接调用该方法的方式进行回调,要使用该法不能写参数!
str = tmp.replace(/https\:\/\/([a-z\.]*)/g, strHandle (map, $1))
// 错误写法:通过匿名函数里使用该方法,该匿名函数要加返回
str = tmp.replace(/https\:\/\/([a-z\.]*)/g, function (map, $1) {
strHandle(map, $1)
// 此处应添加retrun
});