Chào mọi người! Hôm nay tôi sẽ thảo luận về một khái niệm rất nổi tiếng trong lập trình (các hàm hạng nhất). Hiện đã có rất nhiều tài nguyên về chủ đề này, nhưng vẫn còn một số điều mới để lấy từ bài viết này và tôi đã dành thời gian để đơn giản hóa mọi thứ để hiểu rõ hơn.
Theo Wikipedia, một ngôn ngữ lập trình được cho là có các chức năng hạng nhất nếu nó coi các chức năng là công dân hạng nhất .
Điều này có nghĩa là ngôn ngữ hỗ trợ truyền các hàm dưới dạng đối số cho các hàm khác, trả về chúng dưới dạng giá trị từ các hàm khác nhau, gán chúng cho các biến hoặc lưu trữ chúng trong cấu trúc dữ liệu.
Trong Javascript, mọi thứ hoạt động theo cách này vì hàm chỉ là một loại đối tượng khác. Nếu bạn chưa quen với khái niệm này, bạn sẽ cảm thấy nó khá khó xử, đặc biệt nếu bạn đến từ một nền tảng lập trình khác, nhưng bây giờ, hãy tập trung vào điều đó. Vì các đối tượng là các giá trị nên các hàm cũng vậy và Javascript coi chúng là một. Điều này mở ra một cách mới để viết mã linh hoạt hơn vì chúng ta có thể lưu trữ các hàm trong một biến hoặc thêm các thuộc tính.
Tôi đã chia nhỏ những điểm chính thành một danh sách gạch đầu dòng để giúp mọi việc dễ dàng hơn. Để hiểu rõ hơn về các chức năng hạng nhất, đây là một vài điểm để làm rõ nó.
Một điều có thể thực hiện được với hàm hạng nhất là truyền hàm dưới dạng đối số; chúng ta có thể thấy kiểu mã này trong rất nhiều mã Javascript. Ví dụ: phương thức addEventListener, nhận hàm gọi lại Javascript làm đối số, vd
button.addEventListener('click', function(){ console.log('hellloooo') })
Trong đoạn mã trước, chúng tôi quan sát thấy rằng addEventListener nhận được hai đối số, trong đó hàm thứ hai là hàm gọi lại và sẽ được gọi sau khi nhấp vào nút.
Chúng ta có thể trả về các chức năng từ một chức năng khác trong Javascript; nhiều đối tượng trong Javascript có các phương thức, ví dụ: Hàm mảng trong javascript. Ngoài ra, chúng ta có phương thức của hàm, ví dụ: các phương thức Javascript call()
, bind()
, apply()
đều có thể được gọi trên các hàm Javascript.
function count(){ Let counter = 0; return function(){ counter++ } }
Hàm đếm trả về một hàm khác mà chúng tôi đã cập nhật bộ đếm.
Trong Javascript, chúng ta có thể lưu trữ một hàm trong một biến hoặc thậm chí thuộc tính, giống như cách bạn làm với các giá trị trung bình của Javascript.
Const multiply = (a,b) => a * b
Hàm mũi tên Javascript ở trên được lưu trữ trong biến bội số, có thể được gọi là
nhân (3,5) theo cách này.
Một trong những ý nghĩa chính của các hàm hạng nhất là chúng giúp chúng ta có thể viết các hàm bậc cao hơn.
Đây là một hàm nhận một hàm khác làm đối số hoặc một hàm trả về một hàm mới. Điều này chỉ có thể thực hiện được nhờ chức năng hạng nhất.
button.addEventListener('click', function(){ console.log('hellloooo') })
Ở đây addEventListener()
là một ví dụ về hàm bậc cao hơn vì nó nhận một hàm khác làm đối số. Nó thường đề cập đến chức năng gọi lại Javascript vì nó được gọi sau khi HOF chạy. Sự khác biệt chính giữa hàm bậc cao và hàm hạng nhất là hàm hạng nhất là một tính năng mà ngôn ngữ lập trình có hoặc không có, nó đơn giản có nghĩa là tất cả các hàm đều là giá trị.
Tóm lại, điều cần thiết là phải biết không có chức năng hạng nhất trong thực tế; nó chỉ là một khái niệm. Tuy nhiên, trong thực tế, có thể có các hàm bậc cao hơn vì ngôn ngữ hỗ trợ các hàm hạng nhất.