Недоцільно тримати обчислення значень (виразів) окремо від виконання дій (операторів). Ми хочемо точного контролю над тим, де і коли будуть вживатися дії (наприклад, показ повідомлень), але при обчисленні значень, ми краще працюємо на більш абстрактному рівні і не будемо дбати про те, як ці значення обчислюються.
Функція, яка обчислює лише повернене значення, використовуючи лише наведені аргументи, називається чистою .
"Функція", яка виконує дію, - це фактично процедура , яка має ефект .
Будь-які ефекти, спричинені під час обчислення значення, називаються побічними ефектами , і краще уникати їх там, де це можливо ("Мені просто потрібна ця струна, я не знав, що вона забиває базу даних!").
Щоб мінімізувати ймовірність виникнення побічних ефектів, нам слід уникати надсилання занадто багато даних до наших процедур або внесення в них будь-якого розрахунку; якщо деякий розрахунок потрібно виконати заздалегідь, зазвичай це краще зробити окремо в чистому режимі, а потім передати процедурі лише необхідний результат. Це забезпечує чітку мету процедури та зменшує ймовірність її повторного використання згодом як частина обчислення (замість неї можна повторно використовувати чисту функцію).
З цієї ж причини нам слід уникати обробки результатів всередині процедури. Краще повернути результат (якщо такий є) нашою дією та виконати будь-яку подальшу обробку з чистими функціями.
Якщо ми будемо дотримуватися цих правил, ми можемо закінчити процедуру на зразок sayHello
, яка не потребує даних і не має результату. Тому найкращим інтерфейсом для нього є відсутність аргументів і не повернення значення. Це переважно, ніж, наприклад, виклик "console.log" в середині деякого обчислення.
Щоб зменшити потребу в ефектах під час обчислення, ми можемо мати розрахунки, які повертають процедури ; напр. якщо нам потрібно визначитися з дією, яку потрібно здійснити, ми можемо мати чисту функцію вибрати процедуру та повернути її, а не виконувати її безпосередньо.
Так само, щоб зменшити потребу в обчисленні під час процедур, ми можемо мати процедури, які приймають інші параметри як параметри (можливо, результат функції); напр. прийняття масиву процедур і виконання одна за одною.