Вопросы о подписи функций

Я нашел пример javascript в Интернете, который немного смутил меня. Я совершенно новый для javascript, но имею хорошие знания на "традиционных" языках. Я не смог найти ответ, когда я попробовал Google, поэтому я задаю этот вопрос здесь и надеюсь, что кто-то может мне помочь.

Из одного "класса" был выполнен следующий код:

this.foo.addListener("xType", this, this.boo);

Вызываемая функция выглядит так:

//first argument (type:String) what kind of event
//second argument (type:Function) listener - listening function
addListener: function(kindOf, listener) {

Я не понимаю, что количество аргументов не совпадает. Когда функция вызывается, используются 3 аргумента, а именно "xType", this и this.boo, но в сигнатуре функции есть только 2 аргумента, а именно kindOf и прослушиватель. Является ли это некоторой функциональностью javascript, которую вы можете вызывать функциями с некоторым количеством аргументов, чем то, что объявлено в функции? Или как этот код должен работать?

Ответ 1

Является ли это некоторой функциональностью javascript, которую вы можете вызывать функциями с некоторым количеством аргументов, чем то, что объявлено в функции?

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

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

function alertMany() {
    for (var i = 0; i < arguments.length; i++) {
        alert(arguments[i]);
    }
}

alertMany("hello", "goodbye");
alertMany("hello", "hello again", "hello once more", "farewell");
alertMany()

Все эти вызовы будут работать, отображая одно окно предупреждения для каждого аргумента.

Ответ 2

В javascript вы можете создавать функции на лету.

Строка:

addListener: function(kindOf, listener) {

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

В качестве альтернативы вы смотрите на неправильное определение, а фактический код находится в другом месте.

Ответ 3

В ES6 теперь вы можете использовать параметр rest для передачи произвольного количества аргументов в подпись функции:

const addUs = (x, y, ...z) => <your function here>