1748075
Bao đóng (lập trình máy tính)
https://vi.wikipedia.org/wiki?curid=1748075
Title: Bao đóng (lập trình máy tính)
Trong khoa học máy tính, bao đóng (closure) là một hàm hay một tham chiếu tới một hàm cùng với môi trường tham chiếu - một bảng chứa tham chiếu đến mỗi biến không phải cục bộ (hay còn gọi là biến tự do). Closure còn được gọi với tên là lexical closure (bao đóng hay function closure (bao đóng hàm). Bao đóng khác với một con trỏ hàm thuần túy ở chỗ nó cho phép một hàm có thể truy cập các biến không phải cục bộ ngay cả khi hàm này được gọi ngoài phạm vi của nó.
Ví dụ.
Đoạn mã Python dưới đây định nghĩa một hàm codice_1 với một biến cục bộ codice_2 và một hàm lồng (nested function) codice_3
def counter():
 x = 0
 def increment(y):
 nonlocal x
 x += y
 print(x)
 return increment
Bao đóng được trả lại bởi codice_1 có thể được gán cho một biến:
counter1_increment = counter()
counter2_increment = counter()
Khi chúng ta gọi hàm codice_3 thông qua bao đóng sẽ nhận được kết quả như sau:
counter1_increment(1) # in ra kết quả 1
counter1_increment(7) # in ra kết quả 8
counter2_increment(1) # in ra kết quả 1
counter1_increment(1) # in ra kết quả 9
Sự khác biệt về ngữ cảnh.
Phạm vi tác dụng.
Các ngôn ngữ lập trình khác nhau không phải lúc nào cũng thống nhất về lexical environment(tạm dịch: phạm vi tác dụng) và định nghĩa về bao đóng trong các ngôn ngữ vì thế cũng có thể khác nhau. Định nghĩa đơn giản nhất của lexical environment chỉ ra một tập các binding của các biến trong một phạm vi nào đó. Đó cũng chính là điều bao đóng muốn lưu giữ (capture) lại. 
Ý nghĩa binding (tạm dịch: gắn kết) trong các ngôn ngữ cũng khác nhau.
Trong các ngôn ngữ mệnh lệnh (imperative languages) các biến được gắn kết đến các vùng bộ nhớ lưu trữ giá trị của các biến đó. Việc lưu giữ lại các biến kiểu này được gọi là lưu giữ bằng tham chiếu (capturing by reference). Đoạn mã sau miêu tả một ví dụ trong ECMAScript
// ECMAScript
var f, g;
function foo() {
 var x = 0;