Узнать, сколько функция принимает аргументов, можно в её свойстве length
.
var l = (function (a, b, c) {}).length; // == 3
Узнать, сколько в неё было передано аргументов, можно в свойстве length
объекта arguments
.
(function (a, b, c) {
var l = arguments.length; // == 2
})(100, 200);
Хоть объект arguments
и похож на массив, но таковым он не является. У него нет методов, которые есть у массивов. Чтобы превратить его в настоящий массив нужно сделать его независимую копию.
var args = Array.prototype.slice.call(arguments);
Коментарии к заметке
alert.length == 0, но setTimeout.length == 1
«Что-то пошло не так» (ц).
Нативные функции иногда себя очень странно ведут. Не обращайте внимание.
С другой стороны, не обязательно декларировать аргументы, чтобы получить их значения:
Всё зависит от реализации.
Где на практике может понадобиться определить сколько функция принимает аргументов?
Это скорее архитектурный костыль, чем необходимость. Например, при переходе от одного API к другому.
Другим примером может служить очередь из функций. В Node.js модуле Connect в качестве middleware могут предаваться различные функции или объекты. Определяя сколько аргументов принимает middleware, модуль вызваем его должным образом.