Чистая функция в 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)
}
Читайте также
Исследователи выявили уязвимость в Middleware Next.js и другие новости разработки
Исследователи выявили уязвимость в Middleware Next.js и другие новости разработки
Исследователи выявили уязвимость в Middleware Next.js и другие новости разработки

В последнем выпуске новостей для разработчиков: уязвимость в Middleware Next.js, новое CSS-предложение по разделительным линиям, запуск TanStack Form и переход Google к закрытой разработке Android OS.

Вышел релиз Chrome 120
Вышел релиз Chrome 120
Вышел релиз Chrome 120

В этом материале рассказываем о нескольких крупных обновлениях. Релиз Chrome 121 запланирован на 23 января 2024 года.

Три навыка разработки с использованием ИИ, которые вы можете освоить сегодня
Три навыка разработки с использованием ИИ, которые вы можете освоить сегодня
Три навыка разработки с использованием ИИ, которые вы можете освоить сегодня

Антье Барт, главный адвокат разработчиков по генеративному ИИ в Amazon Web Services, делится ключевыми навыками, которые помогут программистам адаптироваться к новой реальности разработки с ИИ. Узнайте, как «вибрационное программирование», генерация подсказок ИИ и использование агентного ИИ могут изменить ваш подход к разработке.

Matrix 2.0: Новая эра децентрализованного общения
Matrix 2.0: Новая эра децентрализованного общения
Matrix 2.0: Новая эра децентрализованного общения

С выпуском версии Matrix 2.0 протокол Matrix достиг важного этапа в развитии. Этот открытый стандарт децентрализованной связи, который поддерживают такие приложения, как Element и FluffyChat, теперь предлагает заметно улучшенные возможности, что делает его более конкурентоспособным и удобным для ежедневного использования.