В функциях 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 также достаточен для этого конкретного случая использования.
function f(foo, bar, ...unnamedArguments)
. - person apsillers   schedule 12.08.2014