在Javascript函数中获取可变数量的参数

时间:2013-12-05 10:41:35

标签: javascript function variables parameters anonymous

我正在使用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],但我想知道我是否可以在函数签名中自定义参数。

谢谢

3 个答案:

答案 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上的文档。