Что произойдет, если я вызову метод JS с большим количеством параметров, чем он определен для принятия?

Я хотел бы знать как для обычных функциональных возможностей JS-разработчика (я), так и для предопределенных DOM-методов. Как, что произойдет, если я попытаюсь вызвать IE attachEvent с сигнатурой WHATWG addEventListener? Например,

elem.attachEvent('onbillgates\'mom', function(e){ this.mount(); }, false);

В частности, обратите внимание на false. Будет ли это что-то делать, даже если подпись метода attachEvent вызывает только два аргумента?

Спасибо.

function foo(FirstOf2, SecondOf2) {
  console.log(FirstOf2 + SecondOf2);
}

foo(1, 2, true);

Ответ 1

JavaScript не имеет понятия списка фиксированных параметров. Для ваших собственных функций вы всегда можете указать столько параметров, сколько хотите, и передать их столько, сколько захотите.

Для встроенных функций, которые коррелируют с собственным кодом, это зависит.

Вы спросили, от чего это зависит:

Посмотрим на ECMA-262

Раздел 15 о встроенных (не путать с хостом) функциях вообще

Если в описании конкретной функции не указано иначе, если для функции или конструктора, описанной в этом разделе, задано меньшее количество аргументов, чем требуется для функции, функция или конструктор должны вести себя точно так, как если бы ей было предоставлено достаточное дополнительное аргументы, каждый из которых является значением undefined.

Хорошо. Если я передаю меньше аргументов, чем нужно, это зависит от спецификации самой функции (прокрутите вниз раздел 15, чтобы найти спецификацию для каждой встроенной функции).

Если иное не указано в описании конкретной функции, если для функции или конструктора, описанной в этом разделе, дается больше аргументов, чем указано для функции, дополнительные аргументы вычисляются по вызову, а затем игнорируются функцией. Однако реализация может определять конкретное поведение конкретной реализации, связанное с такими аргументами, пока поведение не является бросанием исключения TypeError, которое определяется только наличием дополнительного аргумента.

При переходе слишком много аргументов никогда не следует поднимать TypeError. Но все же это может вызвать другие ошибки. Опять же, это зависит от функции, о которой вы говорите.

Вы прямо говорили о DOM, а не о встроенных функциях. Честно говоря, я не могу найти соответствующие части спецификации. Специфика ECMA намного проще читать, чем веб-сайт w3.

Ответ 2

Не повредит. Вы можете даже вызывать функцию с меньшим количеством параметров, чем требуется, если код функции в порядке с несколькими значениями undefined.

Ответ 3

Я не думаю, что это все испортит, если вы явно не используете массив неявных аргументов. Почему вы это делаете?

Ответ 4

Попробуйте взглянуть на этот пост и, возможно, этот.

От MDN:

Объект arguments - это локальная переменная, доступная в все Функции; arguments как свойство функции больше нельзя использовать.

Вы можете обратиться к функции arguments в функции, используя объект arguments. Этот объект содержит запись для каждого аргумента передается функции, первый индекс ввода, начинающийся с 0.

Вы можете использовать объект arguments, если вы вызываете функцию с большим количеством arguments, чем официально объявлено для принятия. Этот метод полезно для функций, которым может передаваться переменное число Аргументы.

function myConcat(separator) {
  var result = "";

  // iterate through non-separator arguments
  for (var i = 1; i < arguments.length; i++) {
    result += arguments[i] + separator;
  }

  return result;
}

Ответ 5

Я столкнулся с этим важным, хотя и старым, вопросом; и я надеюсь, что для будущих поколений будет полезно поделиться с ним своими экспериментами:

  1. Можно использовать объект arguments, чтобы получить доступ к аргументам функции, независимо от количества аргументов в сигнатуре функции.
    Стоит отметить, что это не относится к функциям стрелок:

// Results in an error, as 'arguments' isn't defined
((arg) => console.log(arguments))(1);