×

Closure Là Gì và Làm Thế Nào Để Sử Dụng Chúng?

 

Closure Là Gì?

Closure là một khái niệm quan trọng trong JavaScript (và nhiều ngôn ngữ lập trình khác). Closure xảy ra khi một hàm "ghi nhớ" và có thể truy cập đến phạm vi biến (scope) tại thời điểm hàm được định nghĩa, ngay cả khi hàm đó được gọi bên ngoài phạm vi ban đầu của nó. Điều này có nghĩa là một hàm có thể nhớ được môi trường (bao gồm các biến, hàm khác,...) tại thời điểm nó được tạo ra.

Tại Sao Closure Quan Trọng?

Closure cho phép bạn:

  1. Tạo các biến và hàm "riêng tư".
  2. Duy trì trạng thái của một biến.
  3. Tạo các hàm nhà máy (factory functions).
  4. Cấu trúc mã một cách mô-đun và đóng gói logic.

Ví Dụ Cụ Thể Về Closure

Ví Dụ 1: Duy Trì Trạng Thái Của Biến
function createCounter() {
  let count = 0; // Biến count là một closure

  return function() {
    count++; // Truy cập và thay đổi giá trị của biến count
    return count;
  };
}

const counter = createCounter();

console.log(counter()); // Output: 1
console.log(counter()); // Output: 2
console.log(counter()); // Output: 3

Trong ví dụ này, createCounter trả về một hàm, và hàm này có thể truy cập biến count mặc dù createCounter đã hoàn thành.

Ví Dụ 2: Tạo Các Biến Riêng Tư
function createPerson(name) {
  return {
    getName: function() {
      return name; // Truy cập biến name trong closure
    },
    setName: function(newName) {
      name = newName; // Thay đổi giá trị của biến name
    }
  };
}

const person = createPerson("Alice");
console.log(person.getName()); // Output: Alice

person.setName("Bob");
console.log(person.getName()); // Output: Bob

Trong ví dụ này, name là một biến riêng tư mà chỉ có thể truy cập và thay đổi thông qua các phương thức getNamesetName.

Ví Dụ 3: Tạo Hàm Nhà Máy (Factory Functions)
function createMultiplier(multiplier) {
  return function(num) {
    return num * multiplier; // Truy cập biến multiplier trong closure
  };
}

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

console.log(double(5)); // Output: 10
console.log(triple(5)); // Output: 15

Trong ví dụ này, createMultiplier trả về một hàm sử dụng biến multiplier từ phạm vi ngoài, cho phép tạo ra các hàm cụ thể như doubletriple.

Tổng Kết

Closure là một khái niệm mạnh mẽ trong JavaScript, cho phép các hàm "nhớ" và truy cập đến phạm vi biến tại thời điểm chúng được định nghĩa. Hiểu rõ closure giúp bạn:

  1. Duy trì trạng thái của biến: Như trong ví dụ tạo counter.
  2. Tạo các biến và hàm riêng tư: Như trong ví dụ tạo person.
  3. Tạo các hàm nhà máy: Như trong ví dụ tạo multiplier.

Closure giúp bạn viết mã dễ bảo trì, an toàn và tái sử dụng hơn. Bằng cách tận dụng closure, bạn có thể tạo ra các mô-đun và cấu trúc mã một cách rõ ràng và hiệu quả.

Comments