Higher-Order Function (Hàm bậc cao) trong JavaScript là một khái niệm quan trọng trong lập trình hàm, cho phép bạn viết mã linh hoạt và tái sử dụng. Một hàm được coi là hàm bậc cao nếu nó có ít nhất một trong các đặc điểm sau:

  1. Nhận một hoặc nhiều hàm làm đối số.
  2. Trả về một hàm như là giá trị.

Tại sao sử dụng Higher-Order Functions?

Hàm bậc cao cho phép bạn:

  • Tăng tính linh hoạt: Bạn có thể tạo ra các hàm tổng quát hơn và dễ dàng mở rộng.
  • Giảm thiểu mã lặp lại: Bạn có thể tạo ra các hàm có thể sử dụng lại trong nhiều ngữ cảnh khác nhau.
  • Tạo ra các hàm tùy chỉnh: Bạn có thể tạo ra các hàm phức tạp bằng cách kết hợp các hàm đơn giản.

Ví dụ về Higher-Order Functions

1. Hàm nhận một hàm làm đối số

function greet(name) {
    return `Hello, ${name}!`;
}

function greetUser(greetingFunction, userName) {
    return greetingFunction(userName);
}

console.log(greetUser(greet, 'Alice')); // Kết quả: Hello, Alice!

Trong ví dụ trên, greetUser là một hàm bậc cao vì nó nhận greet như một đối số.

2. Hàm trả về một hàm

function createMultiplier(multiplier) {
    return function(x) {
        return x * multiplier;
    };
}

const double = createMultiplier(2);
const triple = createMultiplier(3);

console.log(double(5)); // Kết quả: 10
console.log(triple(5)); // Kết quả: 15

Hàm createMultiplier là một hàm bậc cao vì nó trả về một hàm khác, x * multiplier.

3. Các hàm tích hợp trong JavaScript

JavaScript cung cấp nhiều hàm bậc cao thông qua các phương thức mảng như map(), filter(), và reduce().

  • map(): Nhận một hàm làm đối số và áp dụng hàm đó lên từng phần tử của mảng, trả về một mảng mới.
const numbers = [1, 2, 3, 4];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // Kết quả: [2, 4, 6, 8]
  • filter(): Nhận một hàm làm đối số và trả về một mảng mới chứa các phần tử mà hàm đó trả về true.
const numbers = [1, 2, 3, 4];
const evens = numbers.filter(num => num % 2 === 0);
console.log(evens); // Kết quả: [2, 4]
  • reduce(): Nhận một hàm làm đối số và sử dụng nó để tổng hợp các phần tử của mảng thành một giá trị duy nhất.
const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, num) => acc + num, 0);
console.log(sum); // Kết quả: 10

Tóm tắt

  • Higher-Order Function là hàm có khả năng nhận hoặc trả về hàm.
  • Chúng giúp tăng tính linh hoạt và khả năng tái sử dụng mã.
  • JavaScript cung cấp nhiều hàm bậc cao tích hợp sẵn cho việc xử lý mảng và các tác vụ khác.

Sử dụng hàm bậc cao sẽ giúp bạn viết mã rõ ràng và hiệu quả hơn, đặc biệt là trong lập trình hàm.