Merupakan ide bagus untuk menjaga agar perhitungan nilai (ekspresi) tidak terpisah dari eksekusi tindakan (pernyataan). Kami ingin kontrol yang tepat atas di mana dan kapan tindakan akan diambil (seperti menampilkan pesan), tetapi ketika menghitung nilai kami lebih suka bekerja pada tingkat yang lebih abstrak dan tidak perlu peduli tentang bagaimana nilai-nilai itu dihitung.
Fungsi yang hanya menghitung nilai balik, hanya menggunakan argumen yang diberikan, disebut murni .
"Fungsi" yang melakukan tindakan sebenarnya adalah prosedur , yang memiliki efek .
Setiap efek yang disebabkan selama perhitungan nilai disebut efek samping , dan lebih baik untuk menghindarinya jika memungkinkan ("Saya hanya membutuhkan string itu, saya tidak tahu itu akan memalu database!").
Untuk meminimalkan kemungkinan efek samping, kita harus menghindari pengiriman terlalu banyak data ke prosedur kita, atau memasukkan perhitungan apa pun ke dalamnya; jika beberapa perhitungan perlu dilakukan sebelumnya, biasanya lebih baik melakukannya secara terpisah dalam fungsi murni, kemudian hanya menyerahkan hasil yang diperlukan untuk prosedur. Ini menjaga tujuan prosedur tetap jelas, dan mengurangi kemungkinan bahwa itu akan digunakan kembali nanti sebagai bagian dari perhitungan (fungsi murni dapat digunakan kembali sebagai gantinya).
Untuk alasan yang sama, kita harus menghindari pemrosesan hasil di dalam suatu prosedur. Lebih baik mengembalikan hasil (jika ada) tindakan kami, dan melakukan pemrosesan selanjutnya dengan fungsi murni.
Jika kita mengikuti aturan ini, kita mungkin berakhir dengan prosedur seperti sayHello
, yang tidak memerlukan data apa pun dan tidak memiliki hasil. Oleh karena itu antarmuka terbaik untuk itu adalah tidak memiliki argumen dan tidak mengembalikan nilai. Ini lebih disukai, misalnya, memanggil "console.log" di tengah-tengah beberapa perhitungan.
Untuk mengurangi kebutuhan akan efek selama perhitungan, kita dapat memiliki perhitungan yang mengembalikan prosedur ; misalnya. jika kita perlu memutuskan tindakan yang akan diambil, kita dapat memiliki fungsi murni memilih prosedur dan mengembalikannya, daripada menjalankannya secara langsung.
Demikian juga, untuk mengurangi kebutuhan akan perhitungan selama prosedur, kita dapat meminta prosedur mengambil prosedur lain sebagai parameter (mungkin hasil dari suatu fungsi); misalnya. mengambil berbagai prosedur dan menjalankan satu demi satu.