С обратным вызовом обещания (ваши обработчики then
и catch
) им будет передан только один аргумент при вызове, и всегда будет передаваться этот аргумент. (Если обещание подчиняется нативной семантике; jQuery Deferred
не всегда.)
В общем случае:
Обычно вас это не волнует, потому что в JavaScript вы можете вызывать функцию с меньшим или большим количеством аргументов, чем с формальными параметрами. То есть это просто отлично:
function foo(a) {
console.log("a = " + a);
}
foo(); // Fewer arguments than params
foo(1, 2, 3); // More arguments than params
Другая причина, по которой вас не волнует, заключается в том, что функция может использовать аргументы, даже если она не объявляет для них формальные параметры, используя параметр rest или псевдомассив arguments
(вы поймете, почему этот фрагмент журналы foo.length
и bar.length
в данный момент):
function foo() {
console.log("First argument: " + arguments[0]);
}
function bar(...rest) {
console.log("First argument: " + rest[0]);
}
foo(1); // First argument: 1
bar("a"); // First argument: a
console.log("foo.length = " + foo.length); // foo.length = 0
console.log("bar.length = " + bar.length); // bar.length = 0
Так что просто определите, с чем ваш API будет вызывать обратные вызовы, и сделайте это, и пользователи API должны убедиться, что они правильно используют то, с чем вы их вызываете.
В тех случаях, когда это важно, вы можете использовать свойство length
функции, чтобы узнать, сколько формальных параметров она объявляет:
function foo(a) {
console.log("a = " + a);
}
console.log(foo.length); // 1
Обратите внимание, что это скажет вам, сколько формальных параметров объявлено ...
- ... без учета параметра покоя (
...identifier
)
- ... только до первого параметра со значением по умолчанию (даже если после него есть параметры без значения по умолчанию)
Так, например:
function foo(a, b = false, c) { // b has a default value
console.log("a = " + a);
}
console.log(foo.length); // 1, even though `c` has no default value,
// because `c` is after `b`
и
function foo(a, ...rest) {
console.log("a = " + a);
}
console.log(foo.length); // 1, because the rest parameter doesn't count