Đó là một ý tưởng tốt để tách biệt các giá trị (biểu thức) khỏi việc thực hiện các hành động (câu lệnh). Chúng tôi muốn kiểm soát chính xác vị trí và thời điểm sẽ thực hiện các hành động (như hiển thị thông báo), nhưng khi tính toán các giá trị, chúng tôi muốn làm việc ở mức độ trừu tượng hơn và không phải quan tâm đến cách tính các giá trị đó.
Hàm chỉ tính toán giá trị trả về, chỉ sử dụng các đối số mà nó đưa ra, được gọi là thuần túy .
Một "chức năng" thực hiện một hành động thực sự là một thủ tục , có tác dụng .
Bất kỳ hiệu ứng nào gây ra trong quá trình tính toán giá trị đều được gọi là tác dụng phụ và tốt hơn hết là tránh chúng ở những nơi có thể ("Tôi chỉ cần chuỗi đó, tôi không biết nó sẽ làm hỏng cơ sở dữ liệu!").
Để giảm thiểu khả năng xảy ra tác dụng phụ, chúng ta nên tránh gửi quá nhiều dữ liệu cho các thủ tục của mình hoặc đặt bất kỳ phép tính nào vào chúng; nếu một số tính toán cần phải được thực hiện trước đó, tốt hơn là nên thực hiện riêng rẽ trong một hàm thuần túy, sau đó chỉ chuyển kết quả được yêu cầu cho thủ tục. Điều này giữ cho mục đích của thủ tục rõ ràng và giảm khả năng nó sẽ được sử dụng lại sau này như một phần của phép tính (thay vào đó, hàm thuần túy có thể được sử dụng lại).
Vì lý do tương tự, chúng ta nên tránh xử lý kết quả bên trong một quy trình. Tốt hơn là trả lại kết quả (nếu có) hành động của chúng tôi và thực hiện bất kỳ xử lý tiếp theo nào với các hàm thuần túy.
Nếu chúng tôi tuân theo các quy tắc này, chúng tôi có thể kết thúc bằng một quy trình như sayHello
không cần dữ liệu và không có kết quả. Do đó giao diện tốt nhất cho nó là không có đối số và không trả về giá trị. Điều này tốt hơn là, ví dụ, gọi "console.log" ở giữa một số tính toán.
Để giảm nhu cầu về hiệu ứng trong quá trình tính toán, chúng ta có thể có các phép tính trả về các thủ tục ; ví dụ. nếu chúng ta cần quyết định thực hiện một hành động, chúng ta có thể có một hàm thuần túy chọn một thủ tục và trả về nó, thay vì thực hiện trực tiếp.
Tương tự như vậy, để giảm nhu cầu tính toán trong các thủ tục, chúng ta có thể có các thủ tục lấy các thủ tục khác làm tham số (có thể là kết quả của hàm); ví dụ. thực hiện một loạt các thủ tục và chạy cái khác