Higher-order functions (HOF) là gì? Lợi ích mà nó mang lại khi sử dụng trong dự án của bạn.

Higher-order functions (HOF) là gì? Lợi ích mà nó mang lại khi sử dụng trong dự án của bạn.

Tin ngắn hàng ngày dành cho bạn
  • R1 chưa qua, R2 đã tới 😅

    Mặc dù mới đang đồn thổi thôi cơ mà chắc chỉ có Deepseek mới gây tiếng vang tương tự như OpenAI hoặc Anthropic. Mà thứ người dùng quan tâm là chất lượng & giá cả 😄

    Deepseek R2 will be releasing soon

    » Xem thêm
  • Opensource này giúp bạn tạo nhanh một trang cá nhân giới thiệu về bản thân (giống như CV á): self.so

    » Xem thêm
  • Cuộc đua mô hình ngày càng khốc liệt khiến các công ty công nghệ không ai muốn bỏ lại phía sau. Llama 4 Scout, Llama 4 Maverick là hai mô hình mã nguồn mở mới nhất của Meta, được quảng cáo với hiệu năng vượt trội, thậm chí còn đánh bại các mô hình tiên tiến nhất như GPT-4.5, Claude Sonnet 3.7, hay Gemini 2.0 Pro... Nhưng bênh cạnh đó, Scout và Maverick đang vấp phải chỉ trích về việc gian lận. Liệu chúng ta có nên đặt lòng tin vào Meta thêm lần nữa 🤔

    Llama 4 Scandal: Meta’s release of Llama 4 overshadowed by cheating allegations on AI benchmark

    » Xem thêm

Vấn đề

Nhớ lại trước đây, khi tôi đọc được bài viết về Higher-order functions thì nó đã gây ra một sự hoang mang nhất định. Do là mới vào nghề, kinh nghiệm chưa có nên đọc lý thuyết khá là khó hiểu. Hồi đó thì cũng đọc cho biết chứ chưa hình dung được tính ứng dụng gì nhiều. Mãi sau mới ngớ ra - ớ cái này xưa nay mình vẫn đang dùng thường xuyên mà!

Bài viết về Higher-order functions thì cũng rất là nhiều trên mạng rồi, bạn đọc chỉ cần tìm trên Google là thấy. Tuy nhiên, vì HOF là một khái niệm quan trọng và có tính ứng dụng cao nên tôi xin phép được viết một bài theo quan điểm cá nhân. Không nói nhiều nữa, bắt đầu thôi.

HOF là gì?

Higher-order functions trong JavaScript là các hàm có khả năng nhận đầu vào là một hoặc nhiều hàm khác hoặc trả về một hàm khác.

Ví dụ, một hàm có thể được truyền vào như một đối số của một hàm khác, hoặc một hàm có thể trả về một hàm khác để sử dụng trong mã của chúng ta. Điều này cho phép chúng ta tạo ra các hàm linh hoạt và tái sử dụng được.

Trong JavaScript, các hàm như map, filter, reduce... là ví dụ tiêu biểu cho HOF. Chúng đều là hàm nhận đối số là một hàm khác và áp dụng hàm đó lên một mảng hoặc các giá trị khác để thực hiện phép biến đổi nhất định.

Cách sử dụng

Bạn có thể ứng dụng HOF để tạo ra các hàm sử dụng linh hoạt cho riêng mình hoặc tạo ra hàm có thể tái sử dụng nhiều lần.

Một trong những trường hợp phổ biến sử dụng HOF là trong các hàm map, filter, reduce. Nếu bạn chưa biết công dụng của 3 hàm này thì tôi đã có một bài viết chi tiết tại Tại sao bạn nên sử dụng thành thạo bộ ba map, filter và reduce trong Javascript?.

Quay lại vấn đề, giả sử chúng ta có một mảng và cần áp dụng một phép toán vào tất cả phần tử trong đó thì chúng ta sử dụng map.

const arr = [1, 2, 3];
const arr2 = arr.map(function (item) {
  return item + 1;
});

map là một HOF vì nó nhận tham số là một hàm. Vì tham số là một hàm, chúng ta có thể viết lại đoạn mã trên một cách có tính tái sử dụng như sau:

const addOne = a => a + 1;

const arr = [1, 2, 3];
const arr2 = arr.map(addOne);

addOne là một hàm nhận vào một số a và trả ra a + 1. Vì thế sau này chúng ta có thể sử dụng addOne ở trong nhiều hàm map khác mà không phải mất công viết lại logic cộng.

Lợi ích của HOF

HOF mang lại khá nhiều lợi ích trong lập trình:

  • Tính tái sử dụng: HOF cho phép tạo ra các hàm linh hoạt và có tính tái sử dụng để giải quyết nhiều vấn đề khác nhau mà không cần phải viết lại cùng một đoạn code nhiều lần. Đồng thời, giảm sử lặp lại của mã.

  • Tách biệt dữ liệu và logic, đơn giản hóa việc viết mã: HOF cho phép tách biệt giữa dữ liệu và logic, giúp cho mã trở nên dễ đọc và dễ bảo trì hơn. Như ví dụ trên, thay vì đoán xem map đang làm nhiệm vụ gì thì chỉ cần nhìn vào tên hàm addOne thì đã có thể đoán ra một phần.

  • Nhiều hàm HOF được tạo ra để hỗ trợ lập trình. Ví dụ như các hàm map, filter... và rất nhiều hàm khác. Mục đích tạo ra chúng để giảm thời gian viết mã, vì nếu không có chúng thì bạn sẽ phải viết nhiều mã hơn để đạt cùng mục đích. Ngoài ra, còn nhiều hàm trong xử lý bất đồng bộ như Promise, async/await và các thư viện ứng dụng HOF để tạo ra hàm xử lý linh hoạt cho lập trình viên.

Bên cạnh những lợi ích, HOF có thể gây khó hiểu và khó tiếp cận cho người mới học JavaScript, vấn đề này có thể khắc phục theo thời gian. Ngoài ra, sử dụng quá nhiều hàm HOF có thể tạo ra một sự phức tạp nhất định trong đọc - hiểu mã, tiêu tốn tài nguyên hệ thống (mỗi hàm là một đối tượng được tạo ra), hoặc cho việc bảo trì sau này. Tuy nhiên, các điểm yếu này hoàn toàn có thể khắc phục được qua thời gian và kinh nghiệm của người lập trình.

Tổng kết

Higher-order functions (HOF) là các hàm có khả năng nhận đầu vào là các hàm hoặc đầu ra là một hàm. HOF được sử dụng rất nhiều trong lập trình JavaScript vì lợi ích mà nó mang lại. Tuy nhiên nó cũng gây ra nhiều vấn đề như hơi khó hiểu đối với người mới và khả năng bảo trì sau này.

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...