在JavaScript函数中,arguments
是一个类似于数组的对象,包含函数的所有参数,无论它们是否被命名:
function f(foo, bar) {
console.log(arguments);
}
f(1, '2', 'foo'); // [1, "2", "foo"]
有没有办法让只没有命名的参数,所以你可以做这样的事情?
function f(foo, bar) {
console.log('foo:', foo, 'bar:', bar, 'the rest:', unnamedArguments);
}
f(1, '2', 'foo'); // foo: 1 bar: "2" the rest: ["foo"]
一个真实的用例是将Angular模块作为参数注入RequireJS模块:
define([
'angular',
'myLibModule', // Exports an Angular module object
'myOtherLibModule', // Exports an Angular module object
], function(angular, myLibModule, myOtherLibModule) {
angular.module('MyApp', [myLibModule.name, myOtherLibModule.name]);
});
由于模块依赖关系列表可能会非常大,因此很快变得非常麻烦。虽然我可以解决它
define([
'angular',
'underscore',
'myLibModule', // Exports an Angular module object
'myOtherLibModule', // Exports an Angular module object
], function(angular, _) {
function angularModuleNames(modules) {
return _.pluck(_.pick(modules, function(item) {
return _.has(item, 'name');
}), 'name');
}
angular.module('MyApp', angularModuleNames(arguments));
});
这也很麻烦,如果我可以做这样的事情会很好:
define([
'angular',
'underscore',
'myLibModule', // Exports an Angular module object
'myOtherLibModule', // Exports an Angular module object
], function(angular, _) {
angular.module('MyApp', _.pluck(unnamedArguments, 'name'));
});
当然,在RequireJS中对依赖项进行分组的方法也足以满足此特定用例。
答案 0 :(得分:8)
声明的参数数量在函数的length
属性中提供。
因此,您可以获得索引大于或等于此length
的参数:
var undeclaredArgs = [].slice.call(arguments, arguments.callee.length);
作为you can't use arguments.callee
in strict mode starting from ES5,您应尽可能使用对该函数的引用:
var undeclaredArgs = [].slice.call(arguments, f.length);