Чистая функция в JavaScript

Определение чистой функции, простое — функция которая возвращает одинаковый результат при выполнении с тем же набором аргументов и не имеет побочных сайдэффектов (внешние переменные, callback, мутация внешнего объекта и т.д). Такие функции называют детерминированными.

На чистые функции очень просто писать unit тесты, она понятна для переиспользования и рассмотрим пару примеров:

// Базовый пример, это сумма чисел
function sum(a, b) {
  return a + b;
}

// Продвинутый пример из реальной жизни, может быть генерация ЧПУ
function translit(text){
        return text.replace( /([а-яё])|([\s_-])|([^a-z\d])/gi,
            function( all, ch, space, words, i ) {
                if ( space || words ) {
                    return space ? '-' : '';
                }
                var code = ch.charCodeAt(0),
                    next = text.charAt( i + 1 ),
                    index = code == 1025 || code == 1105 ? 0 :
                        code > 1071 ? code - 1071 : code - 1039,
                    t = ['yo','a','b','v','g','d','e','zh',
                        'z','i','y','k','l','m','n','o','p',
                        'r','s','t','u','f','h','c','ch','sh',
                        'shch','','y','','e','yu','ya'
                    ],
                    next = next && next.toUpperCase() === next ? 1 : 0;
                return ch.toUpperCase() === ch ? next ? t[ index ].toUpperCase() :
                    t[ index ].substr(0,1).toUpperCase() +
                        t[ index ].substring(1) : t[ index ];
            }
        );
}

И посмотрим какие могут быть «не чистые функции» или недетерминированные:

// использование внешних переменных, которые могут измениться
function costCalculator(a, b) {
  return a * b * CUSTOM_RATE_COEF;
}

// мутирование объекта, каллбеки
function superFunction(obj, cb) {
  obj.name = 'Иван';
  cb(obj)
}
Читайте также
Gleam 1.0: Статически типизированный функциональный язык на Erlang VM достиг v1.0
Gleam 1.0: Статически типизированный функциональный язык на Erlang VM достиг v1.0
Gleam 1.0: Статически типизированный функциональный язык на Erlang VM достиг v1.0

Gleam, функциональный язык с акторной моделью, работающий на виртуальной машине Erlang (BEAM), достиг версии 1.0. Это означает, что теперь он готов к использованию в производственных системах с гарантией обратной совместимости на основе семантического версионирования. Gleam стремится быть языком с небольшой областью применения, легким для чтения и понимания, а также выразительным. Преимущества Gleam: Конкуренция на BEAM […]

Конференция QCon: как бороться с поддельными ИИ-изображениями при помощи библиотек JavaScript
Конференция QCon: как бороться с поддельными ИИ-изображениями при помощи библиотек JavaScript
Конференция QCon: как бороться с поддельными ИИ-изображениями при помощи библиотек JavaScript

Силлс выступает за новую норму, согласно которой все реальные изображения должны иметь метку времени, достоверные метаданные и подтверждаться проверяемыми документами, которые гарантируют их подлинность. 

15 сайтов, чтобы сэкономить время CSS-разработчику
15 сайтов, чтобы сэкономить время CSS-разработчику
15 сайтов, чтобы сэкономить время CSS-разработчику

Собрали 15 сайтов, которые помогут сэкономить много времени и расширить опыт разработки CSS.

Релиз Node.js v22
Релиз Node.js v22
Релиз Node.js v22

В новом релизе 22 версии, является крупное обновление WebSockets и нового компилятора V8