Вопросы о подписи функций
Я нашел пример 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>