Можно ли передать функцию как аргумент в другую функцию в JavaScript
Что проверяют
Знаете ли вы, что функция в JavaScript это обычное значение, и пользуетесь ли этим осознанно. Вопрос звучит как проверка новичка, но ответ показывает, понимаете ли вы функции высшего порядка, потерю контекста и разницу между ссылкой на функцию и её вызовом.
Как отвечать
Да, функции это значения первого класса: их присваивают переменным, кладут в массивы и объекты, передают аргументами и возвращают из других функций. Функция, которая принимает или возвращает функцию, называется функцией высшего порядка, и на этом построена половина стандартной библиотеки.
const twice = (fn, x) => fn(fn(x));
twice((n) => n + 3, 1); // 7Полезно назвать, где это встречается каждый день: методы массивов map, filter, reduce, обработчики в addEventListener, колбэки таймеров, продолжения промисов в then, компаратор в sort. Отдельно скажите про пользу: поведение выносится наружу, и одна функция обслуживает разные случаи без ветвлений внутри себя. В React ровно этим заняты пропсы-обработчики и хуки, принимающие функцию.
Если хотите добавить глубины, упомяните замыкание: переданная функция помнит окружение, в котором была объявлена, а не то, куда её передали. Именно поэтому колбэк видит переменные родителя, хотя вызывается совсем в другом месте.
Где спотыкаются
Ставят скобки при передаче. Запись setTimeout(load(), 1000) вызывает функцию немедленно и передаёт таймеру её результат, обычно undefined. Передавать нужно ссылку, без скобок.
Теряют this. Метод объекта, переданный аргументом, вызывается уже без владельца, и внутри this совсем не тот объект. Лечится стрелочной обёрткой или привязкой через bind.
Не замечают лишних аргументов. Классика это ["1", "7", "11"].map(parseInt), где вторым параметром прилетает индекс и становится системой счисления, а в результате появляется NaN. Функцию, принимающую больше одного аргумента, оборачивают, а не передают напрямую.