我可以在Javascript中重复功能参数名称吗?

时间:2011-07-27 23:21:21

标签: javascript

以下功能是否合法且便携?

function(_, _, x){
    return x;
}

有时候我想编写一个不使用最左边参数的回调,所以我想知道最简洁的方法是什么。


结论

function(_1, _2, x)可能与它当时一样短。

5 个答案:

答案 0 :(得分:9)

在非严格模式代码中有效,但在严格模式代码中无效

  

如果任何标识符值出现多次,则为SyntaxError   在严格模式FunctionDeclaration或的FormalParameterList中   FunctionExpression。

来源: http://es5.github.com/#x13.1

因此,您可能希望避免这种情况,因为在将来的某个时刻您将需要继续进行严格模式......

答案 1 :(得分:3)

您可以使用arguments,但是可以使用:

function test(_, _, x){
    console.log(arguments);
    return x;
}

console.log(test('a','b','c'));

输出:

["a", "b", "c"]
c

http://jsfiddle.net/JdrDY/

如果您尝试使用_参数,那么它就是打印的内容:

["a", "b", "c"]
b
c

http://jsfiddle.net/JdrDY/2/

答案 2 :(得分:1)

var ignoreLeftParam = function(count, f) {
    return function() {
        f.apply(this, Array.prototype.slice.call(arguments, count));
    }
}

ignoreLeftParam(2, function(x) {
    return x;
});

编写一个忽略参数的通用实用程序可能会被认为是更整洁。

答案 3 :(得分:0)

我花了五秒钟来测试,显然是的,这是合法的。

非主题

我明白你为什么要这样做。以jQuery的$.get()方法为例。假设您的“成功”回调函数只需使用第三个jqXHR参数。

$.get('url', function(_, _, jqXHR) {
    // only use jqXHR
});

虽然您可以将前两个参数命名为xy

答案 4 :(得分:0)

如果您遇到此类函数签名的问题,请尝试重写它以接受具有命名属性的单个options对象。这样你就可以传递你想要的任何参数组合。

E.g:

function test(options) {
   if('numberOfHands' in options)
      console.log('I have ' + options.numberOfHands + ' hands!');

   if('duration' in options)
      console.log('I last for ' + options.duration);
}