Hàm bậc cao

Frontend SELF VI
Mức độ , Bài học
Có sẵn

5.1 Khái niệm cơ bản

Hàm bậc cao là một khía cạnh quan trọng của lập trình hàm và được sử dụng rộng rãi trong JavaScript. Chúng cho phép viết mã một cách trừu tượng hơn, ngắn gọn hơn và có thể tái sử dụng.

Hàm bậc cao là gì?

Hàm bậc cao (higher-order functions) là các hàm có thể nhận các hàm khác làm tham số hoặc trả về các hàm khác làm kết quả. Chúng cho phép sử dụng hàm như đối tượng hạng nhất, điều này giúp tạo ra các chương trình trừu tượng và mô-đun hơn.

Ví dụ về hàm bậc cao

  1. Truyền hàm như là tham số.
  2. Trả về hàm từ các hàm khác.

5.2 Truyền hàm như là tham số

Sử dụng các phương thức mảng tích hợp

JavaScript cung cấp nhiều phương thức tích hợp để làm việc với mảng, những phương thức này là các hàm bậc cao như forEach(), map(), filter(), reduce() và các phương thức khác.

1. Phương thức forEach()

Phương thức forEach() thực hiện một hàm được chỉ định một lần cho mỗi phần tử của mảng.

JavaScript
    
      const numbers = [1, 2, 3, 4, 5];

      numbers.forEach(function(number) {
        console.log(number);
      });
      // In ra: 1 2 3 4 5
    
  

2. Phương thức map()

Phương thức map() tạo một mảng mới bằng cách gọi một hàm được chỉ định cho mỗi phần tử của mảng.

JavaScript
    
      const numbers = [1, 2, 3, 4, 5];
      const squaredNumbers = numbers.map(function(number) {
        return number * number;
      });

      console.log(squaredNumbers);
      // In ra: [1, 4, 9, 16, 25]
    
  

3. Phương thức filter()

Phương thức filter() tạo ra một mảng mới với tất cả các phần tử vượt qua kiểm tra do hàm được truyền vào chỉ định.

JavaScript
    
      const numbers = [1, 2, 3, 4, 5];
      const evenNumbers = numbers.filter(function(number) {
        return number % 2 === 0;
      });

      console.log(evenNumbers);
      // In ra: [2, 4]
    
  

4. Phương thức reduce()

Phương thức reduce() áp dụng một hàm cho một bộ tích lũy và mỗi phần tử của mảng (từ trái sang phải), làm giảm nó xuống một giá trị duy nhất.

JavaScript
    
      const numbers = [1, 2, 3, 4, 5];
      const sum = numbers.reduce(function(total, number) {
        return total + number;
      }, 0);

      console.log(sum);
      // In ra: 15
    
  

5.3 Trả về hàm từ các hàm khác

Hàm bậc cao có thể trả về các hàm khác, cho phép tạo ra các hàm linh hoạt và cấu hình được.

1. Currying

Currying là quá trình chuyển đổi một hàm nhận nhiều tham số thành một hàm nhận một tham số và trả về một hàm mới nhận tham số tiếp theo, và cứ thế tiếp tục.

Ví dụ về currying:

JavaScript
    
      function multiply(a) {
        return function(b) {
          return a * b;
        };
      }

      const multiplyByTwo = multiply(2);
      console.log(multiplyByTwo(5)); // In ra: 10

      const multiplyByThree = multiply(3);
      console.log(multiplyByThree(5)); // In ra: 15
    
  

2. Tạo hàm có thể tùy chỉnh

Hàm bậc cao cho phép tạo ra các hàm có thể tùy chỉnh thông qua tham số truyền vào.

Ví dụ:

JavaScript
    
      function createGreeting(greeting) {
        return function(name) {
          console.log(`${greeting}, ${name}!`);
        };
      }

      const sayHello = createGreeting('Hello');
      sayHello('Alice'); // In ra: Hello, Alice!

      const sayHi = createGreeting('Hi');
      sayHi('Bob'); // In ra: Hi, Bob!
    
  

5.4 Ứng dụng thực tế

Hãy xem xét ứng dụng thực tế của hàm bậc cao.

Hàm compose()

Hàm compose() cho phép kết hợp nhiều hàm thành một hàm để áp dụng chúng theo chuỗi:

JavaScript
    
      function compose(...functions) {
        return function(initialValue) {
          return functions.reduceRight((value, func) => func(value), initialValue);
        };
      }

      const addOne = x => x + 1;
      const double = x => x * 2;
      const addOneAndDouble = compose(double, addOne);
      console.log(addOneAndDouble(5)); // In ra: 12 (đầu tiên cộng 1 vào 5, sau đó nhân đôi kết quả)
    
  

Hàm bậc cao không đồng bộ

Hàm bậc cao không đồng bộ cho phép làm việc với các thao tác không đồng bộ, như yêu cầu API hoặc làm việc với bộ đếm thời gian:

JavaScript
    
      function fetchData(callback) {
        setTimeout(() => {
          callback('Data received');
        }, 1000);
      }

      function processData(data) {
        console.log(data);
      }

      fetchData(processData);
      // In ra: Data received (sau 1 giây)
    
  
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION