Trong các ngôn ngữ lập trình, đóng cửa là một tính năng phổ biến và thường được mong muốn. Wikipedia nói (nhấn mạnh của tôi):
Trong khoa học máy tính, bao đóng (...) là một hàm cùng với môi trường tham chiếu cho các biến không cục bộ của hàm đó. Một bao đóng cho phép một hàm truy cập các biến ngoài phạm vi từ vựng ngay lập tức của nó.
Vì vậy, một bao đóng thực chất là một giá trị hàm (nặc danh?) Có thể sử dụng các biến ngoài phạm vi của chính nó. Theo kinh nghiệm của tôi, điều này có nghĩa là nó có thể truy cập các biến có phạm vi tại điểm định nghĩa của nó.
Trong thực tế, khái niệm này dường như đang chuyển hướng, mặc dù, ít nhất là bên ngoài lập trình chức năng. Các ngôn ngữ khác nhau thực hiện các ngữ nghĩa khác nhau, thậm chí dường như có những cuộc chiến tranh về. Nhiều lập trình viên dường như không biết đóng cửa là gì, xem chúng ít hơn các hàm ẩn danh.
Ngoài ra, dường như tồn tại những rào cản lớn khi thực hiện đóng cửa. Đáng chú ý nhất, Java 7 được cho là bao gồm chúng nhưng tính năng này đã bị đẩy trở lại bản phát hành trong tương lai.
Tại sao đóng cửa rất khó (để hiểu và) để nhận ra? Đây là một câu hỏi quá rộng và mơ hồ, vì vậy hãy để tôi tập trung vào nó nhiều hơn với những câu hỏi liên kết với nhau:
- Có vấn đề gì với việc thể hiện sự khép kín trong các hình thức ngữ nghĩa thông thường (bước nhỏ, bước lớn, ...) không?
- Là các hệ thống loại hiện có không phù hợp cho việc đóng cửa và không thể mở rộng dễ dàng?
- Có vấn đề gì khi đưa các bao đóng phù hợp với bản dịch thủ tục dựa trên ngăn xếp truyền thống không?
Lưu ý rằng câu hỏi liên quan chủ yếu đến các ngôn ngữ thủ tục, hướng đối tượng và kịch bản nói chung. Theo tôi biết, ngôn ngữ chức năng không có bất kỳ vấn đề.