Определение чистой функции, простое — функция которая возвращает одинаковый результат при выполнении с тем же набором аргументов и не имеет побочных сайдэффектов (внешние переменные, 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)
}