> Что такое каррирование (JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: циан, ITFB, Aston
Стек: JavaScript
> Пример ответа
Короткий ответ
Каррирование - это техника в функциональном программировании, при которой функция с несколькими аргументами преобразуется в последовательность функций, каждая из которых принимает один аргумент. В JavaScript это позволяет частично применять аргументы и создавать специализированные функции на основе общих.
Подробное объяснение
Каррирование превращает вызов f(a, b, c) в f(a)(b)(c). Каждая промежуточная функция запоминает уже переданные аргументы через замыкание и возвращает новую функцию, ожидающую следующий аргумент. Это отличается от частичного применения, где фиксируется часть аргументов, но результат всё ещё может принимать несколько аргументов сразу.
В JavaScript каррирование реализуется вручную или через библиотеки вроде lodash (_.curry). Оно полезно для создания переиспользуемых функций, композиции и упрощения передачи функций в качестве колбэков.
На практике
Каррирование часто используется для:
- создания функций с предзаданными параметрами (например, логирование с фиксированным уровнем);
- удобной работы с функциями высшего порядка в map/filter/reduce;
- улучшения читаемости кода при работе с конфигурациями.
Пример кода
JAVASCRIPT// Обычная функцияfunction multiply(a, b, c) {return a * b * c;}// Каррированная версияfunction curryMultiply(a) {return function(b) {return function(c) {return a * b * c;};};}// Использованиеconst result = curryMultiply(2)(3)(4); // 24// Частичное применениеconst multiplyByTwo = curryMultiply(2);const multiplyByTwoAndThree = multiplyByTwo(3);console.log(multiplyByTwoAndThree(5)); // 30// Универсальная функция каррированияfunction curry(fn) {return function curried(...args) {if (args.length >= fn.length) {return fn.apply(this, args);} else {return function(...nextArgs) {return curried.apply(this, args.concat(nextArgs));};}};}const curriedMultiply = curry(multiply);console.log(curriedMultiply(2)(3)(4)); // 24console.log(curriedMultiply(2, 3)(4)); // 24
Как отвечать на собеседовании
Начни с определения, затем покажи разницу между обычным вызовом и каррированным. Обязательно упомяни замыкания, так как они лежат в основе реализации. Приведи простой пример с числами или строками. Если спросят про практическое применение - расскажи про частичное применение и переиспользование кода. Не углубляйся в сложные математические концепции, если не просят.
Что проверяет интервьюер
Интервьюер проверяет понимание замыканий, функций высшего порядка и базовых принципов функционального программирования. Также важна способность объяснить, зачем это нужно на практике, а не просто воспроизвести определение. Для junior-уровня достаточно показать, что ты понимаешь механику и можешь написать простую реализацию.
Типичные ошибки
- путать каррирование с частичным применением - это разные вещи;
- забывать, что каррирование работает только с функциями фиксированной арности (количество параметров известно заранее);
- не учитывать
thisпри реализации универсального каррирования; - говорить, что каррирование ускоряет выполнение кода - это не так, оно добавляет накладные расходы на создание функций;
- использовать стрелочные функции без понимания, как они влияют на контекст
this.
> Похожие задачи по frontend
Что такое промисы в JavaScript и как они работают
В чем разница между var, const и let в JavaScript
Что такое контекст (this) в JavaScript
Что такое event loop в JavaScript и как он работает с микрозадачами и макрозадачами
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью