Một đóng cửa cơ bản là một chức năng B lồng vào bên trong một hàm A có thể truy cập các biến cục bộ của một:
function A() {
var x = 5;
function B() {
print(x);
}
return B;
}
Nếu bạn đến từ một nền C++, điều này là khá khó khăn để tiêu hóa. Khi chúng ta cố gắng gọi hàm trả về bởi A, thì nó sẽ đề cập đến những gì x
? Nếu không x
không hợp lệ kể từ khi A()
chấm dứt?
Câu trả lời là x
thực sự tồn tại. Điều đó B
chúng tôi trở lại thực sự mang x
xung quanh với nó ngầm. Cool, eh?
Theo nghĩa chung hơn, việc đóng là một hàm được liên kết với một số dữ liệu. Trong một ngôn ngữ không có đóng cửa như C, mọi chương trình đều có một số hàm cố định. Với các bao đóng, bạn có thể, trong một nghĩa nào đó, "tạo các hàm" bằng cách liên kết chúng với dữ liệu động. Tất nhiên, không ai ngăn cản bạn khỏi thi đua đóng cửa trong C, nhưng đôi khi nó có thể là một nỗi đau.
Đóng cửa thực sự hữu ích. Ví dụ: giả sử chúng tôi muốn triển khai "vòng lặp for" của riêng mình:
function loop(count, f) {
for (var i = 0; i < count; i++)
f(i);
}
var array = [0,1,2,3,4];
loop(5, function(i) {
print(array[i]);
});
Được phép truy cập các biến bên ngoài mà không thực hiện một loạt các điều vô nghĩa. Nếu không đóng cửa, bạn có thể phải vượt qua một biến bối cảnh vào loop
chức năng thay vì:
function loop(count, f, ctx) {
for (var i = 0; i < count; i++)
f(i, ctx);
}
var array = [0,1,2,3,4];
loop(5, function(i, ctx) {
print(ctx[i]);
}, array);
Một ví dụ khác: giả sử chúng ta muốn đăng ký một callback trong jQuery, nhưng nó có thể được thực hiện rất lâu sau khi các chức năng và người gọi của nó và caller gọi của nó của được thực hiện chạy:
$(document).ready(function(){
var clicked = 0;
$('#button').click(function(){
clicked++;
alert("You've pressed the button " + clicked + " times.");
});
});
Nếu Javascript được nhiều hơn như C++ (trước C++ 0x), mà clicked
biến sẽ được lâu rồi do thời gian chức năng cho $(document).ready()
được gọi, và nút bấm gọi lại sẽ có hành vi không xác định.
Câu hỏi http://stackoverflow.com/questions/36636/what-is-a-closure và http://stackoverflow.com/questions/1095707/what-is-the-exact-definition-of-a- đóng cửa tương tự như thế này –