
- 1. Khái niệm Closure là gì?
- 2. Tìm hiểu cơ chế hoạt động của Closure
- 2.1. Môi trường thực thi được tạo ra
- 2.2. Hàm bên trong "ghi nhớ" môi trường tĩnh
- 2.3. Sự tồn tại "bền bỉ" của môi trường biến
- 2.4. Sức mạnh của phạm vi tĩnh (Lexical Scope)
- 3. Cách nhận diện Closure như thế nào?
- 4. Closures lưu trữ biến số của Outer Function theo dạng tham chiếu
- 5. Những ứng dụng thực tế của Closure
Trong lậu trình JavaScript, Closure được xem là một trong những khái niệm quan trọng nhưng đồng thời cũng khiến nhiều người bỏ ngỡ. Closure không chỉ là cách JavaScript quản lý phạm vi biến, mà còn là nền tảng để tạo ra những chức năng đặc biệt như biến private, ghi nhớ trạng thái và xây dựng những module linh hoạt. Bài viết này Devwork sẽ giúc bạn hiểu sâu Closure là gì, nó hoạt động ra sao và áp dụng như thế nào trong thực tế.
Khái niệm Closure là gì?
Trong lập trình hàm, "closure" là một khái niệm cơ bản. Nó xảy ra khi một hàm được tạo ra bên trong một hàm khác. Điểm mấu chốt là, hàm bên trong vẫn có thể truy cập các biến của hàm bên ngoài, ngay cả khi hàm bên ngoài đã chạy xong.
Khái niệm Closure là gì?
Hiểu một cách khác, khi một hàm bên trong dùng một biến từ bên ngoài phạm vi của nó, một "closure" sẽ được tạo ra. Closure cho phép hàm bên trong "nhớ" trạng thái của biến bên ngoài tại thời điểm nó được tạo. Sau đó, hàm bên trong có thể dùng những giá trị này dù hàm bên ngoài đã kết thúc.
Đây là một tính năng rất hữu ích, đặc biệt trong các ngôn ngữ có first-class functions như JavaScript, Python và Ruby. Closure được tạo và dùng linh hoạt để giải quyết nhiều vấn đề khác nhau.
Tìm hiểu cơ chế hoạt động của Closure
Vậy, điều gì đã cho phép Closure hoạt động một cách vi diệu như vậy? Hãy cùng nhau khám phá cơ chế hoạt động bên trong:
Môi trường thực thi được tạo ra
Khi một hàm được gọi, trình thông dịch (interpreter) hoặc trình biên dịch (compiler) sẽ tạo ra một môi trường thực thi (execution context) cho hàm đó. Môi trường này bao gồm cả môi trường biến (variable environment), nơi lưu trữ các biến được khai báo trong phạm vi của hàm.
Hàm bên trong "ghi nhớ" môi trường tĩnh
Khi một hàm bên trong được định nghĩa bên trong một hàm bên ngoài, nó không chỉ đơn thuần là một đoạn mã. Nó còn "ghi nhớ" một tham chiếu đến môi trường biến của hàm bên ngoài tại thời điểm nó được định nghĩa. Đây được gọi là lexical environment (môi trường tĩnh), bởi vì nó được xác định bởi vị trí của hàm trong mã nguồn (lexical scope).
Tìm hiểu cơ chế hoạt động của Closure
Sự tồn tại "bền bỉ" của môi trường biến
Thông thường, khi một hàm bên ngoài thực thi xong, môi trường thực thi của nó (bao gồm cả môi trường biến) sẽ bị "xóa" để giải phóng bộ nhớ. Tuy nhiên, nếu hàm bên trong (closure) vẫn còn được tham chiếu (ví dụ: được gán cho một biến toàn cục, được trả về từ hàm bên ngoài, hoặc được sử dụng trong một callback), thì môi trường biến mà nó "ghi nhớ" sẽ không bị thu hồi. Nó sẽ tiếp tục tồn tại để hàm bên trong có thể truy cập các biến từ môi trường bên ngoài.
Sức mạnh của phạm vi tĩnh (Lexical Scope)
Closure hoạt động dựa trên nguyên tắc phạm vi tĩnh (lexical scope). Điều này có nghĩa là khả năng truy cập biến của một hàm được xác định bởi vị trí của hàm đó trong cấu trúc mã nguồn, chứ không phải bởi nơi hàm đó được gọi. Khi hàm bên trong cố gắng truy cập một biến, nó sẽ tìm kiếm trong phạm vi cục bộ của chính nó trước, sau đó tìm kiếm trong phạm vi của hàm bên ngoài nơi nó được định nghĩa, và cứ tiếp tục như vậy lên các phạm vi bao ngoài cho đến khi tìm thấy biến hoặc đến phạm vi toàn cục.
Cách nhận diện Closure như thế nào?
Closure là một khái niệm đặc biệt trong JavaScript, biểu thị mối liên hệ giữa một hàm và phạm vi biến bên ngoài của nó tại thời điểm hàm đó được tạo ra. Khi một hàm được định nghĩa bên trong một hàm khác, và sau đó truy cập vào các biến của hàm cha — thì closure đã được hình thành. Điều quan trọng là closure không phải là một kiểu dữ liệu hay một đối tượng cụ thể mà bạn có thể “nhìn thấy” trực tiếp trong mã, mà là kết quả của cách JavaScript xử lý phạm vi biến và bộ nhớ trong quá trình thực thi.
Cách nhận diện Closure như thế nào?
Closure thường được nhận biết thông qua cách các biến bên ngoài vẫn có thể được truy cập bởi một hàm con, ngay cả khi hàm cha đã kết thúc thực thi. Để dễ hình dung, hãy cùng xem ví dụ dưới đây:
Trong ví dụ này, hàm init khai báo một biến cục bộ name và một hàm con hi sử dụng biến đó. Khi init() được gọi, nó trả về hàm hi, và biến f sẽ giữ tham chiếu tới hi. Điều đáng chú ý là hi vẫn có thể sử dụng biến name ngay cả khi init() đã kết thúc. Điều này xảy ra vì hi giữ lại "closure" – tức là môi trường nơi nó được tạo ra, bao gồm cả biến name.
Cách dễ nhất để nhận diện closure là nhìn vào những hàm được trả về từ một hàm khác, nhưng vẫn có khả năng truy cập các biến bên ngoài phạm vi của chúng. Các công cụ như Chrome DevTools có thể hỗ trợ kiểm tra sự tồn tại của closure bằng cách sử dụng tab Scope để quan sát môi trường lexical mà các hàm đang nắm giữ.
Tóm lại, để nhận diện một closure, bạn cần chú ý đến:
- Một hàm được định nghĩa bên trong một hàm khác.
- Hàm con vẫn có quyền truy cập vào biến của hàm cha.
- Biến được giữ lại và sử dụng sau khi hàm cha đã kết thúc.
Việc hiểu và nhận diện closure không chỉ giúp bạn viết mã hiệu quả hơn mà còn là bước đệm để làm chủ các khái niệm sâu hơn trong JavaScript như memoization, callback, module pattern hay hàm bất đồng bộ (async/await).
Bạn đọc tham khảo thêm:
Sass là gì? Tìm hiểu cách thức hoạt động và những lợi ích của Sass
NPM là gì? Tìm hiểu phương thức hoạt động và ứng dụng của npm
Closures lưu trữ biến số của Outer Function theo dạng tham chiếu
Trong thế giới lập trình, đặc biệt là với các ngôn ngữ như JavaScript hay Python, closure đóng vai trò như một cầu nối giữa một hàm và phạm vi bao quanh nó. Cụ thể, closure cho phép hàm bên trong (inner function) truy cập được các biến từ hàm bên ngoài (outer function), ngay cả sau khi outer function đã được thực thi xong.
Closures lưu trữ biến số của Outer Function theo dạng tham chiếu
Điều đặc biệt là những biến của outer function không bị sao chép sang inner function, mà được liên kết trực tiếp thông qua tham chiếu (reference). Nói cách khác, closure không tạo ra một bản sao mới, mà nó giữ nguyên sự kết nối với vùng nhớ gốc của các biến này. Do đó, nếu giá trị của một biến được thay đổi bên trong inner function, thay đổi đó sẽ phản ánh trực tiếp lên biến gốc trong môi trường mà closure đã giữ lại.
Khi outer function thực thi và trả về inner function, closure sẽ đi kèm với tất cả các biến mà inner function sử dụng từ outer function. Nhờ vậy, ngay cả khi outer function đã “rời khỏi stack”, môi trường của nó vẫn được giữ lại để phục vụ cho inner function — giúp tăng tính linh hoạt và khả năng lưu trữ trạng thái (state) trong ứng dụng.
Đây là một ví dụ trong JavaScript:
javascript
function outerFunction() {
var outerVariable = 'I am from the outer function';
function innerFunction() {
console.log(outerVariable);
}
return innerFunction;
}
var closure = outerFunction();
closure(); // Output: I am from the outer function
Trong ví dụ này, inner function vẫn có thể truy cập và sử dụng outerVariable ngay cả khi outer function đã kết thúc, nhờ vào Closure lưu trữ biến theo dạng tham chiếu.
Những ứng dụng thực tế của Closure
Closure là một trong những tính năng mạnh mẽ và linh hoạt nhất của JavaScript, thường được sử dụng để giải quyết các bài toán về quản lý phạm vi biến, bảo vệ dữ liệu và tạo ra các hành vi có trạng thái. Dưới đây là những ứng dụng phổ biến và thiết thực nhất của closure trong lập trình thực tế:
- Tạo biến private (Biến riêng tư): Một trong những cách ứng dụng phổ biến nhất của closure là tạo ra các biến riêng tư – tức là các biến không thể truy cập trực tiếp từ bên ngoài hàm, mà chỉ có thể được thao tác thông qua các hàm được trả về.
- Tạo counter/tracker (Biến đếm và theo dõi trạng thái): Closure giúp lưu giữ trạng thái giữa các lần gọi hàm, từ đó dễ dàng xây dựng các bộ đếm (counter) hoặc trình theo dõi trạng thái.
- Callback function / Event handler: Trong các callback function (đặc biệt là xử lý sự kiện hoặc asynchronous task), closure cho phép giữ lại giá trị tại thời điểm hàm được tạo ra, ngay cả khi nó được thực thi sau đó.
- Module Pattern (Mô hình module): Closure là nền tảng để xây dựng module pattern trong JavaScript – một mô hình rất phổ biến để tổ chức mã theo cách giống như class trong các ngôn ngữ khác. Bằng cách sử dụng closure, bạn có thể ẩn logic nội bộ và chỉ expose một API rõ ràng ra bên ngoài.
- Tối ưu hiệu suất và tránh xung đột biến toàn cục: Closure cho phép giữ các biến cục bộ “sống” mà không cần đưa chúng ra phạm vi toàn cục. Điều này giúp tránh xung đột tên biến, đặc biệt trong các ứng dụng lớn hoặc khi tích hợp thư viện bên ngoài.
- Memoization – Tối ưu hiệu năng qua cache: Closure cũng có thể dùng để lưu trữ kết quả tính toán cũ, giúp tiết kiệm thời gian trong những trường hợp phải gọi lại cùng một hàm nhiều lần với cùng một đầu vào.
Closure không chỉ là một tính năng hay công cụ, nó là cốt lõi trong cách JavaScript xử lý phạm vi và bộ nhớ. Việc hiểu Closure giúc lập trình viên viết code ngắn gọn, an toàn và tối ưu hơn. Khi áp dụng Closure đúng cách, bạn có thể xây dựng những chương trình có khả năng tái sử dụng cao, giảm thiểu xung đột biến và tăng tính trực quan trong kiểm soát logic.

Devwork là Nền tảng TUYỂN DỤNG IT CẤP TỐC với mô hình kết nối Nhà tuyển dụng với mạng lưới hơn 30.000 headhunter tuyển dụng ở khắp mọi nơi.Với hơn 1800 doanh nghiệp IT tin dùng Devwork để :
Tag Cloud:
Tác giả: Lưu Quang Linh
Việc làm tại Devwork
Bài viết liên quan
Hosting là gì? Giải mã về hosting và cách hoạt động
Khi bắt đầu xây dựng website, chắc hẳn bạn đã nghe đến khái niệm hosting hàng chục lần. Nhưng hosting là gì, nó có vai trò ra sao trong việc vận hành website và làm sao để chọn được dịch vụ phù hợp? Bài viết này, Devwork sẽ giúp bạn giải mã mọi thắc mắc từ cơ bản đến chuyên sâu về thế giới Web Hosting, từ khái niệm, các loại hình phổ biến cho đến cách thức chúng hoạt động, đảm bảo bạn sẽ có cái nhìn toàn diện nhất!...
Lương gross là gì? Cách quy đổi lương gross sang net dễ hiểu nhất
Khi phỏng vấn hoặc đọc hợp đồng lao động, lương gross là cụm từ xuất hiện gần như 100%. Nhưng lương gross là gì mà lại quan trọng đến vậy? Nếu bạn đang bối rối chưa biết lương gross là gì và lương net là gì thì bài viết này Devwork sẽ giúp bạn hiểu tường tận từ khái niệm, cách tính cho đến cách quy đổi đơn giản nhất.

Cách đặt mật khẩu máy tính đơn giản, bảo mật tuyệt đối 2026
Chiếc máy tính, dù là PC hay laptop không chỉ là công cụ làm việc mà còn là "ngân hàng" lưu trữ vô số dữ liệu quan trọng: tài liệu cá nhân, thông tin ngân hàng, hình ảnh riêng tư... Nếu một ngày, những thông tin này rơi vào tay kẻ xấu, hậu quả sẽ thế nào? Chỉ với vài bước đơn giản, bạn có thể bảo vệ máy tính an toàn tuyệt đối bằng cách đặt mật khẩu máy tính. Bài viết này Devwork sẽ hướng dẫn chi tiết từ A-Z, phù hợp cho cả người dùng laptop và PC, giúp bạn tự làm được ngay lần đầu tiên.

Intern là gì? Toàn bộ những điều bạn cần biết về vị trí Intern
Với sự gia tăng mạnh mẽ của nhu cầu tuyển dụng thực tập sinh tại các doanh nghiệp, khái niệm intern và internship ngày càng trở nên quen thuộc, đặc biệt với sinh viên năm cuối, người mới ra trường. Tuy nhiên, không ít bạn trẻ vẫn còn băn khoăn intern là gì, làm intern là làm gì, hay công việc intern có gì khác với fresher. Trong bài viết này, Devwork.vn sẽ giúp bạn hiểu rõ hơn về vị trí intern, đồng thời chia sẻ những cơ hội thực tập hấp dẫn dành cho người mới bắt đầu.

Case study là gì? Phương pháp phân tích case study hiệu quả
Case study không phải cụm từ xa lạ trong marketing, kinh doanh hay học tập. Nhưng làm sao để tiếp cận và giải case study hiệu quả thì không phải ai cũng biết và làm được. Chính vì vậy, trong bài viết hôm nay, cùng Devwork đi tìm hiểu chi tiết về case study là gì, khám phá bí mật đằng sau các case study thành công, từ đó giúp bạn có cái nhìn toàn diện nhất để áp dụng vào công việc hoặc doanh nghiệp của mình.
Product Owner (PO) là gì? Giải mã vai trò quan trọng trong IT
Trong những năm gần đây, đặc biệt là trong môi trường phát triển linh hoạt Agile và Scrum, vai trò của PO ngày càng trở nên quan trọng. PO là thuật ngữ quen thuộc trong lĩnh vực IT và quản lý dự án, nhưng không phải ai cũng hiểu rõ. Vậy PO là gì, PO là viết tắt của từ gì và vai trò thực sự của PO trong doanh nghiệp là gì? Bài viết này Devwork sẽ giải thích chi tiết, giúp bạn nắm bắt kiến thức cốt lõi và ứng dụng hiệu quả.















