以下功能是否合法且便携?
function(_, _, x){
return x;
}
有时候我想编写一个不使用最左边参数的回调,所以我想知道最简洁的方法是什么。
结论:
function(_1, _2, x)
可能与它当时一样短。
答案 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
如果您尝试使用_
参数,那么它就是打印的内容:
["a", "b", "c"]
b
c
答案 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
});
虽然您可以将前两个参数命名为x
和y
。
答案 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);
}