Closure là gì? Đặc điểm nổi bật của Closure trong JavaScript

1188
31-03-2022
Closure là gì? Đặc điểm nổi bật của Closure trong JavaScript

Closure là một khái niệm phổ biến trong Javascript mà mọi lập trình viên cần phải biết. Vậy Closure là gì mà lại có ý nghĩa quan trọng và mang tính quyết định như vậy? Nếu bạn chưa từng nghe hoặc đã nghe nhưng chưa hiểu về Closure thì Bizfly Cloud sẽ giúp bạn qua bài viết được chia sẻ dưới đây.

Closure là gì? 

Closure là một tập hợp các hàm được viết lồng vào trong một hàm khác với mục đích biến toàn cục và biến cục bộ của hàm ngay cả khi nó đã đóng lại hoặc sử dụng biến cục bộ của chính nó. Closure trong Javascript là một thuộc tính cực mạnh. Không chỉ là ngôn ngữ Javascript, Closure còn góp mặt trong nhiều loại ngôn ngữ lập trình khác nữa.

Closure có thể truy cập đến với các biến của hàm khác ngoài các biến của Closure và các biến cục bộ khác. Điều quan trọng Closure vẫn có thể lưu giữ được trạng thái của các biến có bên trong nó. Nói cách khác, khi bạn trả về một hàm hoặc gán một hàm cho một biến thì Closure sẽ mang theo giá trị của những biến mà nó phụ thuộc.

Javascript Closure là một tập hợp bao gồm các hàm và môi trường mà trong đó các hàm số đã được khai báo và môi trường sẽ bao gồm những biến cục bộ thuộc trong phạm vi của các hàm số đã được khai báo.

Một hàm Closure có khả năng truy cập biến số tại ba phạm vi khác nhau bao gồm:

  • Biến dạng toàn cục (global)
  • Biến nằm trong hàm số đã được khai báo có chứa sẵn hàm Closure.
  • Biến nằm bên trong hoặc ở phía trên hàm Closure.
Closure được viết lồng vào trong một hàm khácmục đích biến toàn cục và biến cục bộ

Closure được viết lồng vào trong một hàm khácmục đích biến toàn cục và biến cục bộ

Một hàm Closure có khả năng truy cập biến số tại ba phạm vi khác nhau bao gồm:

  • Biến dạng toàn cục (global)
  • Biến nằm trong hàm số đã được khai báo có chứa sẵn hàm Closure.
  • Biến nằm bên trong hoặc ở phía trên hàm Closure.

Đặc điểm của Closure trong JS 

Nếu bạn muốn tìm hiểu và vận dụng tốt Closure trong JavaScript thì bạn cần nắm rõ những đặc điểm sau đây:

- Hàm Closure có khả năng truy cập tới biến của hàm chứa nó ngay cả khi hàm đó đã được return

  • Thông thường, các biến cục bộ trong một hàm đã return sẽ được giải phóng nhưng Closure trong Javascript thì hoàn toàn khác. Bạn có thể truy cập được đến những biến cục bộ đó cho dù các outer function đã được thực hiện xong.
  • Ví dụ: Một hàm Closure sử dụng biến cục bộ của outer function là local và intro. Khi hàm adder (2) được thực hiện thì kết quả trả về sẽ tiếp tục được gán với hàm này. Hiểu đơn giản, adder (2) chứa nested function sẽ được trả về từ việc gọi hàm adder (2). Khi adder (2) được gọi, kết quả trả về sẽ là 12. Điều này chứng tỏ các hàm Closure hàm Closure hoàn toàn có thể truy cập vào biến cục bộ của outer function là local và intro ngay cả khi hàm adder 2 đã thực thi xong.
Đặc điểm của Closure trong JS

Hàm Closure có khả năng truy cập tới hàm chứa nó ngay cả khi hàm đó đã được return

- Hàm Closure thực hiện lưu trữ biến của outer function theo kiểu tham chiếu:

  • Ví dụ: Hàm khởi tạo objId trả về một đối tượng bao gồm hai hàm Closure là setId và getId và cùng sử dụng chung một biến cục bộ Id. Khi myObject.getId được gọi thì kết quả trả về giá trị của biến cục bộ là 1. Và myObject.setId (10) được gọi để cập nhật giá trị của id. Nếu Closure trong Javascript chỉ lưu biến cục bộ theo giá trị thì giá trị của biến cục bộ id không thay đổi. Tuy nhiên, khi myObject.setId (10) được gọi tiếp thì giá trị trả về là 10. Điều này chứng tỏ hàm Closure phải thực hiện lưu biến cục bộ theo kiểu tham chiếu.

Ứng dụng thực tế của Closure 

Để nhận biết được những ứng dụng thực tế của Closure, bạn có thể xem xét qua các ví dụ dưới đây:

- Tạo thành một Function factory:

  • Ví dụ: Hàm make Exponentiation tương tự một Function factory và nó tuỳ vào các tham số được truyền vào để tạo ra các function. Hai Closure sqrt và sqr cùng sở hữu body tương tự nhau nhưng biến tương đương khác nhau.

- Mô phỏng lại phạm vi của biến trong lập trình hướng đối tượng OOP (variable visibility):

  • Bên trong Javascript sẽ không có khái niệm class bất kỳ nào được sử dụng đúng nghĩa như trong C++. Class trong ES6 chỉ được sử dụng như cách hack hoặc khai báo.
  • Ví dụ: Các hàm tuy có body khác nhau là increment, decrement và value nhưng chúng đều cùng chia sẻ variable Equivalent. Đây chính là bí quyết giúp mô phỏng class trong JavaScript. Khi một hàm Closure update một biến thì class sẽ được ghi nhận tại một Closure khác.
Ứng dụng thực tế của Closure


- Closure Scope Chain: Ba phạm vi Closure có khả năng truy cập bao gồm phạm vi tự do (Local Scope), phạm vi bên ngoài (Outer Function Scope) và Global Scope.

Khi lập trình, sai lầm phổ biến nhất của các lập trình viên chính là không nhận ra trường hợp Outer Function là một hàm số lồng. Điều này sẽ dẫn đến việc phạm vi của Outer Function trở thành một chuỗi phạm vi không còn hiệu quả.

Hiểu rõ Closure là gì cũng như những đặc điểm và ứng dụng thực tế của nó trong bài viết trên sẽ giúp bạn có được cái nhìn tổng quát nhất về Closure và không cần phải đau đầu cho những lần debug. Kiến thức về Closure không quá nhiều nên mỗi Developer nên trang bị và đẩy mạnh cho mình những thông tin cần thiết về mảng này để nâng cao khả năng tăng tiến trong công việc một cách có hiệu quả.

Nếu bạn muốn tìm hiểu thêm những nội dung khác có liên quan hay muốn đưa thêm những ý kiến khác cho Bizfly Cloud thì có thể để lại phần bình luận hoặc nhắn tin trực tiếp để nhận được lời giải đáp nhanh chóng nhé!

>>> Xem thêm: Scope, Closure, This và tổ chức bộ nhớ trong Javascript

Bizfly Cloud là nhà cung cấp dịch vụ điện toán đám mây với chi phí thấp, được vận hành bởi VCCorp.

Bizfly Cloud là một trong 4 doanh nghiệp nòng cốt trong "Chiến dịch thúc đẩy chuyển đổi số bằng công nghệ điện toán đám mây Việt Nam" của Bộ TT&TT; đáp ứng đầy đủ toàn bộ tiêu chí, chỉ tiêu kỹ thuật của nền tảng điện toán đám mây phục vụ Chính phủ điện tử/chính quyền điện tử.

Độc giả quan tâm đến các giải pháp của Bizfly Cloud có thể truy cập tại đây.

DÙNG THỬ MIỄN PHÍ và NHẬN ƯU ĐÃI 3 THÁNG tại: Manage.bizflycloud

SHARE