Closure là gì? Tìm hiểu cách hoạt động và cách nhận biết Closure

Blog / Tin công nghệ 05/06/2025
closure-la-gi
Phụ lục

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ì?

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

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?

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

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ộ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

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 để :

  • Tối ưu chi phí
  • Tiết kiệm thời gian
  • Tăng tốc tuyển dụng tối đa
  • Đăng ký ngay Devwork trong hôm nay để tuyển dụng những tài năng ưu tú nhất.

    Tag Cloud:

    Tác giả: Lưu Quang Linh

    Link chia sẻ

    Bình luận

    Việc làm tại Devwork

    khám phá các cơ hội việc làm tốt nhất tại Devwork Xem thêm

    Bài viết liên quan

    Danh sách bài viết liên quan có thể bạn sẽ thích Xem thêm
    ky-su-cong-nghe-thong-tin

    Kỹ sư công nghệ thông tin: Học gì, làm gì, mức lương bao nhiêu?

    17:00 21/03/2026

    Trong kỷ nguyên số 4.0, Công nghệ Thông tin (CNTT) đã trở thành ngành mũi nhọn, dẫn dắt sự chuyển mình của mọi lĩnh vực trong đời sống và kinh tế. Vai trò của những kỹ sư công nghệ thông tin - những người kiến tạo và vận hành thế giới số - ngày càng trở nên quan trọng. Vậy cụ thể, một kỹ sư CNTT học những gì, làm những công việc gì và mức lương có thực sự hấp dẫn như lời đồn? Bài viết toàn diện dưới đây từ Devwork sẽ giải đáp tất cả những thắc mắc đó....

    Tìm hiểu từ A-Z về hệ điều hành Linux từ cơ bản đến nâng cao

    17:00 21/03/2026

    Trong thế giới công nghệ, hệ điều hành linux được ví như "trụ cột thầm lặng" của internet và là nền tảng cho vô số hệ thống máy tính toàn cầu. Từ những siêu máy tính, máy chủ web cho đến điện thoại Android và các thiết bị thông minh, Linux hiện diện ở khắp mọi nơi. Vậy Linux là gì và tại sao nó lại quan trọng đến vậy? Bài viết toàn diện từ A đến Z dưới đây của Devwork sẽ dẫn dắt bạn khám phá mọi khía cạnh của Linux

    he-dieu-hanh-linux

    Top phần mềm ghép hình trên điện thoại đẹp, dễ dùng và miễn phí cho người mới

    17:00 29/03/2026

    Nhu cầu tạo ảnh ghép chất lượng cao ngay trên điện thoại ngày càng phổ biến khi người dùng muốn nhanh chóng chỉnh sửa hình ảnh để chia sẻ lên mạng xã hội, phục vụ công việc bán hàng hoặc lưu giữ khoảnh khắc cá nhân. Bài viết dưới đây Devwork sẽ cung cấp cho bạn danh sách những phần mềm ghép hình tốt nhất hiện nay, tiêu chí lựa chọn ứng dụng phù hợp và hướng dẫn cơ bản để tạo bố cục ảnh đẹp mắt. Tất cả đều được tổng hợp theo hướng mạch lạc, chi tiết và dễ ứng dụng cho mọi đối tượng.

    phan-mem-ghep-hinh-tren-dien-thoai

    Cách tải video YouTube chất lượng cao: Hướng dẫn chi tiết, đơn giản cho mọi thiết bị

    17:00 28/03/2026

    YouTube là kho tàng video khổng lồ với vô vàn nội dung hữu ích, từ hướng dẫn học tập, giải trí cho đến những video tài liệu quý giá. Tuy nhiên, không phải lúc nào bạn cũng có kết nối internet ổn định để xem trực tuyến. Việc biết cách tải video YouTube chất lượng cao về thiết bị sẽ giúp bạn chủ động xem lại mọi lúc, mọi nơi. Bài viết toàn diện dưới đây từ Devwork sẽ hướng dẫn bạn từ A đến Z, từ việc chọn lựa chuẩn chất lượng phù hợp đến các bước thực hiện chi tiết trên cả máy tính và điện thoại.

    cach-tai-video-youtube-chat-luong-cao
    kiem-tra-toc-do-mang

    Hướng dẫn kiểm tra tốc độ mạng: Cách đo, cách hiểu và cách cải thiện

    10:00 29/03/2026

    Kiểm tra tốc độ mạng là bước quan trọng giúp bạn nắm rõ hiệu năng kết nối Internet, từ đó tối ưu trải nghiệm khi học tập, làm việc hay giải trí trực tuyến. Bài viết dưới đây Devwork sẽ hướng dẫn kiểm tra tốc độ mạng chi tiết, giải thích các chỉ số cơ bản như download, upload, ping, jitter, đồng thời chỉ ra cách đo chính xác và những mẹo cải thiện tốc độ mạng khi gặp tình trạng chậm hoặc không ổn định.

    phan-mem-kiem-tra-toc-do-mang-wifi

    Tổng hợp 6 phần mềm kiểm tra tốc độ mạng wifi tốt nhất

    11:06 29/03/2026

    Bạn đang gặp phải tình trạng mạng wifi chập chờn, xem video liên tục bị giật lag hay tải file mãi không xong? Nguyên nhân có thể đến từ tốc độ mạng không ổn định. Việc sử dụng một phần mềm kiểm tra tốc độ mạng wifi chính xác là bước đầu tiên và quan trọng nhất để chẩn đoán vấn đề. Bài viết dưới đây từ Devwork sẽ giới thiệu đến bạn 6 công cụ kiểm tra tốc độ mạng hàng đầu