0Pricing
JavaScript Academy · Урок

Бесточечный стиль

Составляйте функции, не называя аргументы.

«Бесточечный стиль» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 4 уроков всего.

Что такое бесточечный стиль

Бесточечный (или неявный) стиль определяет функции путём объединения других функций, не упоминая их аргументы. Аргументы становятся неявными точками, передаваемыми по цепочке.

function double(n) { return n * 2; }
const nums = [1, 2, 3];
// pointed: argument named explicitly
console.log(nums.map((n) => double(n))); // [2, 4, 6]
// point-free: no named argument
console.log(nums.map(double));            // [2, 4, 6]

Прямая передача функций

Если обратный вызов просто передаёт свой аргумент другой функции, эту функцию можно передать по имени вместо оборачивания.

const len = (s) => s.length;
const words = ["a", "bb", "ccc"];
console.log(words.map((w) => w.length)); // pointed: [1, 2, 3]
console.log(words.map(len));             // point-free: [1, 2, 3]

Композиция функций

Бесточечный код опирается на composition: создание новой функции путём передачи результата одной функции следующей.

const compose = (f, g) => (x) => f(g(x));
const inc = (n) => n + 1;
const double = (n) => n * 2;
const incThenDouble = compose(double, inc);
console.log(incThenDouble(3)); // (3+1)*2 = 8

Вспомогательная функция pipe

pipe читает операции слева направо, что многие считают более понятным, чем compose. Она применяет функции по порядку.

const pipe = (...fns) => (x) => fns.reduce((acc, f) => f(acc), x);
const inc = (n) => n + 1;
const double = (n) => n * 2;
const f = pipe(inc, double);
console.log(f(3)); // 8

Построение конвейеров

С помощью pipe можно выразить многоэтапное преобразование в виде именованной функции, ни разу не называя данные.

const pipe = (...fns) => (x) => fns.reduce((a, f) => f(a), x);
const trim = (s) => s.trim();
const lower = (s) => s.toLowerCase();
const clean = pipe(trim, lower);
console.log(clean("  HELLO  ")); // "hello"

Каррирование делает стиль бесточечным

Каррирование превращает функцию с несколькими аргументами в цепочку функций с одним аргументом. В результате получаются готовые к композиции одноместные функции.

const multiply = (a) => (b) => a * b;
const triple = multiply(3);
console.log([1, 2, 3].map(triple)); // [3, 6, 9]

Частичное применение

Фиксация некоторых аргументов заранее создаёт специализированную функцию, которую можно передать напрямую, — ещё один путь к бесточечному коду.

const add = (a, b) => a + b;
const add10 = add.bind(null, 10);
console.log([1, 2, 3].map(add10)); // [11, 12, 13]

Композиция условий

Можно создавать логические вспомогательные функции на основе других функций, получая аккуратные бесточечные фильтры без лишнего шума встроенных стрелочных функций.

const isEven = (n) => n % 2 === 0;
const negate = (fn) => (x) => !fn(x);
const isOdd = negate(isEven);
console.log([1, 2, 3, 4].filter(isOdd)); // [1, 3]

Компромисс между выразительностью и понятностью

Бесточечный стиль может быть элегантным, но при чрезмерном использовании становится загадочным. Используйте его, когда он проясняет намерение (map(double)), а если имя аргумента помогает пониманию, явно указывайте этот аргумент.

const names = ["ada", "bob"];
console.log(names.map((n) => n.toUpperCase())); // ["ADA","BOB"]

Проблема со ссылкой на метод

Передача метода по имени может привести к потере его this. Оберните метод или привяжите его, если функция зависит от контекста объекта.

const calc = {
  factor: 2,
  scale(n) { return n * this.factor; }
};
console.log([1, 2].map(calc.scale.bind(calc))); // [2, 4]

Композиция реальных преобразований

Объединяя небольшие именованные функции в конвейер, вы получаете декларативный, тестируемый и бесточечный поток данных.

const pipe = (...fns) => (x) => fns.reduce((a, f) => f(a), x);
const toNums = (arr) => arr.map(Number);
const onlyPos = (arr) => arr.filter((n) => n > 0);
const sum = (arr) => arr.reduce((a, n) => a + n, 0);
const process = pipe(toNums, onlyPos, sum);
console.log(process(["3", "-1", "4"])); // 7

Быстрая проверка

Бесточечный стиль.

Итоги

Бесточечный стиль создаёт функции путём композиции других функций без именования аргументов. Передавайте функции по ссылке (map(double)), объединяйте их с помощью compose/pipe, а для создания одноместных функций используйте каррирование или частичное применение. Следите за потерей this при передаче ссылок на методы и явно указывайте аргумент, если так понятнее.

Часто задаваемые вопросы

Урок «Бесточечный стиль» бесплатный?

Да — полный текст урока «Бесточечный стиль» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Бесточечный стиль»?

Составляйте функции, не называя аргументы. Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать JavaScript Academy?

Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Бесточечный стиль»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке JavaScript Academy?

Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Чистые функции и побочные эффекты
  2. Декларативное преобразование данных
  3. Избегание мутаций
  4. Бесточечный стиль
← Назад к JavaScript Academy