> Что такое каррирование (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)); // 24
console.log(curriedMultiply(2, 3)(4)); // 24

Как отвечать на собеседовании

Начни с определения, затем покажи разницу между обычным вызовом и каррированным. Обязательно упомяни замыкания, так как они лежат в основе реализации. Приведи простой пример с числами или строками. Если спросят про практическое применение - расскажи про частичное применение и переиспользование кода. Не углубляйся в сложные математические концепции, если не просят.

Что проверяет интервьюер

Интервьюер проверяет понимание замыканий, функций высшего порядка и базовых принципов функционального программирования. Также важна способность объяснить, зачем это нужно на практике, а не просто воспроизвести определение. Для junior-уровня достаточно показать, что ты понимаешь механику и можешь написать простую реализацию.

Типичные ошибки

  • путать каррирование с частичным применением - это разные вещи;
  • забывать, что каррирование работает только с функциями фиксированной арности (количество параметров известно заранее);
  • не учитывать this при реализации универсального каррирования;
  • говорить, что каррирование ускоряет выполнение кода - это не так, оно добавляет накладные расходы на создание функций;
  • использовать стрелочные функции без понимания, как они влияют на контекст this.

> Похожие задачи по frontend

Что такое промисы в JavaScript и как они работают

Уровень: juniorКатегория: Технические вопросы
Компания: Иннотех, Cyber Interactive, Kvando Technologies, Soft_Media_Group, ООО Премиум ИТ Солюшен, ЛитРес, IT-One, Софт Медиа Групп, Библио-Глобус, Сбер, Globaldrive, Purrweb, SmartWay, Яндекс
Стек: JavaScript

В чем разница между var, const и let в JavaScript

Уровень: seniorКатегория: Технические вопросы
Компания: ЛитРес
Стек: JavaScript

Что такое контекст (this) в JavaScript

Уровень: juniorКатегория: Технические вопросы
Компания: YADRO, Garage Eight, циан, Soft_Media_Group, VK, Инити, Aston, Kaspersky, Centicore, IT-One, EdenAI, Сбер, TYMY, HolyWeb, Purrweb, ООО Снэп АйТи
Стек: JavaScript

Что такое event loop в JavaScript и как он работает с микрозадачами и макрозадачами

Уровень: juniorКатегория: Технические вопросы
Компания: amoCRM, Иннотех, Cyber Interactive, Альфа-банк, YADRO, Garage Eight, Kvando Technologies, циан, Soft_Media_Group, ООО Премиум ИТ Солюшен, VK, Kodix, РСХБ, LeverX, Инити, Aston, Газпромбанк, Домклик, IT-One, Софт Медиа Групп, МТГ Бизнес решения, Библио-Глобус, Rutube, Дом.рф, intelsy, Avito, Сфера, EdenAI, Сбер, Арго, TYMY, 1221 Systems, Исходный Код, Globaldrive, Кэтрид Диджитал, SmartWay, ООО Снэп АйТи
Стек: JavaScript

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью