Задача. По нажатию на кнопки A и B добавлять буквы a и b в значение element. Варианты решения.
1. Написать для каждой кнопки свой хандлер:
function handleClickA() {
element.innerHTML += 'a';
}
function handleClickB() {
element.innerHTML += 'a';
}
a.addEventListener('click', hanldeClickA);
b.addEventListener('click', hanldeClickB);
Главная проблема подобных решений дублирование кода. Букв 26/33, еще цифры и спец символы.
Решение 2. Написать билдер:
function buildHandler(char) {
return function() {
element.innerHTML += char;
}
}
a.addEventListener('click', buildHandler(a.innerHTML));
b.addEventListener('click', buildHandler(b.innerHTML));
С подобными билдерами очень удобно работать в цикле:
for (let key in keys) {
key.addEventListener('click', buildHandler(key.innerHTML);
}
Почему именно нужен return function() (не просто return)?
addEventListener принимает вторым аргументом функцию, именно ее функция билдер и возвращает.