- Published on
Closure trong javascript là gì, cho ví dụ?
- Authors
- Name
- Tien Minh Pham
- @TinMinhPhm1
Usage
Trong JavaScript, Closure là một hàm có quyền truy cập vào các biến trong phạm vi từ khi nó được tạo ra, ngay cả khi hàm đó được thực thi bên ngoài phạm vi này. Hiểu đơn giản, closure là một hàm "ghi nhớ" môi trường mà nó được khai báo, bao gồm cả các biến trong phạm vi của nó.
Closure cho phép các biến cục bộ "sống" lâu hơn sau khi hàm chứa chúng đã hoàn tất việc thực thi. Điều này thường xảy ra khi một hàm bên trong được trả về từ một hàm bên ngoài và tiếp tục được sử dụng.
function createCounter() {
let count = 0 // Biến cục bộ của hàm createCounter
return function () {
count += 1 // Hàm này truy cập vào biến count
return count
}
}
const counter = createCounter() // Tạo một instance của counter
console.log(counter()) // Kết quả: 1
console.log(counter()) // Kết quả: 2
console.log(counter()) // Kết quả: 3
Giải thích:
Trong ví dụ trên, hàm createCounter
trả về một hàm ẩn danh (closure), có thể truy cập vào biến count
trong phạm vi của createCounter
. Khi chúng ta gọi counter()
, hàm này vẫn "nhớ" giá trị của count
mặc dù createCounter
đã hoàn thành. Điều này là nhờ vào cơ chế closure.
Mỗi lần gọi counter()
, giá trị count
được tăng lên 1 và lưu lại trong môi trường của hàm trả về, cho phép nó "giữ" giá trị giữa các lần gọi.
Một ví dụ khác với tham số:
function createMultiplier(multiplier) {
return function (number) {
return number * multiplier
}
}
const double = createMultiplier(2) // multiplier = 2
console.log(double(5)) // Kết quả: 10
const triple = createMultiplier(3) // multiplier = 3
console.log(triple(5)) // Kết quả: 15
Trong ví dụ này, closure cho phép hàm trả về có quyền truy cập vào tham số multiplier
của createMultiplier
dù đã kết thúc, giúp tạo ra các hàm double
và triple
có khả năng "nhân đôi" hoặc "nhân ba" giá trị số đầu vào.