我正在使用JS解析XML文档,并在标记名称的每个第一个字母处更改为小写。 I.E. <MyTagName></MyTagName>
将成为<myTagName></myTagName>
,非常简单,一切正常。我正在使用正则表达式查找所有标签并用骆驼版替换名称,如下所示:
regex = /(<)(\/){0,1}([A-Z]*)(\/){0,1}(>)/ig;
result = result.replace(regex, function(s, m0, m1, m2, m3, m4){
return m0 + (m1 ? m1 : "") + camelNotation(m2) + (m3 ? m3 : "") + m4;
});
我的问题是:有没有办法在匿名函数中获取一些参数,这是我replace
函数的第二个参数,以更动态的方式,如数组?像
result = result.replace(regex, function(s, param[]){
return param[0] + (param[1]? param[1] : "") + camelNotation(param[2]) + (param[3] ? param[3] : "") + param[4];
});
我可能会使用arguments[i]
,但我想知道我是否可以在函数签名中自定义参数。
谢谢
答案 0 :(得分:2)
我经常使用以下简单的高阶函数:
splat = function(fun, thisp) {
return function() { return fun.call(thisp, [].slice.call(arguments)) }
}
e.g。
"a1b2c3d4e5f6".replace(/(\D)(\d)/g, splat(function(a) {
return a[1].toUpperCase() + (++a[2]);
}))
答案 1 :(得分:1)
你可以像这样抓住函数体内的参数:
result = result.replace(regex, function(s, /*params...*/){
// get real array without the first argument
var params = [].slice.call(arguments, 1);
...
});
我可以使用参数[i],但我想知道我是否可以自定义我的 函数签名中的参数。
你可以使用arguments
或者将你想要的参数放到一个数组中,但除此之外没有其他语法(但是,它即将推出)。 “休息参数”的惯例是将它们注释为注释。
答案 2 :(得分:1)
您可以使用转发功能将参数打包成数组:
result.replace(regex, function(s) {
return realFunction(s, Array.prototype.slice.call(arguments, 1));
});
其中realFunction
具有签名function(s, params)
(如果您愿意,它当然可以定义并内联调用)。有关其工作原理的信息,请参阅arguments
上的文档。