Nói cách khác, bao đóng được tạo khi một hàm con giữ môi trường của phạm vi cha ngay cả sau khi hàm cha đã thực thi
Ghi chú. Closure là khái niệm về hàm + môi trường từ vựng trong đó hàm được tạo. vì vậy mọi hàm được khai báo trong hàm khác thì nó có quyền truy cập vào chuỗi phạm vi của hàm bên ngoài và các biến được tạo trong phạm vi của hàm bên ngoài sẽ không bị hủy
Bây giờ hãy xem một ví dụ khác.
ví dụ 2.
Javascript
function
foo[]
4
foo[]
5function
foo[]
7
foo[]
8/* 1 */
3 /* 2 */
0
foo[]
5/* 1 */
6
foo[]
5/* 1 */
3 /* 1 */
9
/* 1 */
6
foo[]
4 /* 2 */
8
/* 2 */
9
foo[]
70
Giải trình. Trong ví dụ trên, chúng tôi đã sử dụng hàm tham số thay vì hàm mặc định. Lưu ý ngay cả khi chúng ta hoàn thành việc thực thi foo[5], chúng ta có thể truy cập biến outside_arg từ hàm bên trong. Và khi thực thi hàm bên trong, hãy tạo tổng của outside_arg và inner_arg như mong muốn.
đầu ra.
Bây giờ hãy xem một ví dụ về sự khép kín trong một vòng lặp.
Trong ví dụ này, chúng ta sẽ lưu trữ một hàm ẩn danh ở mọi chỉ mục của một mảng.
ví dụ 3.
Javascript
foo[]
71
function
foo[]
73
foo[]
7
foo[]
5foo[]
4 foo[]
77
foo[]
5foo[]
4 foo[]
70
foo[]
5foo[]
72 foo[]
73
foo[]
5foo[]
7
foo[]
8foo[]
77
foo[]
8foo[]
79function
foo[]
41/* 1 */
3 foo[]
43
foo[]
5/* 1 */
6
foo[]
5____147
foo[]
5/* 1 */
3 foo[]
70
/* 1 */
6
foo[]
4 foo[]
73
foo[]
74
foo[]
75
foo[]
76
foo[]
77
đầu ra.
Giải trình. Bạn đã đoán đúng câu trả lời? . Closure không nhớ giá trị của biến, nó chỉ trỏ đến biến hoặc lưu trữ tham chiếu của biến và do đó, trả về giá trị hiện tại. Trong đoạn mã trên khi chúng tôi cố gắng cập nhật giá trị của nó sẽ được phản ánh cho tất cả vì bao đóng lưu trữ tham chiếu.
Hãy xem một cách chính xác để viết đoạn mã trên để nhận các giá trị khác nhau của i tại các chỉ mục khác nhau.
Ví dụ 4.
Javascript
foo[]
71
function
foo[]
73
foo[]
7
foo[]
5function
/* 1 */
14
foo[]
5foo[]
7
foo[]
8/* 1 */
3 function
/* 1 */
00
foo[]
8foo[]
7
/* 1 */
03/* 1 */
3 /* 1 */
05
foo[]
8/* 1 */
6
foo[]
5/* 1 */
6
foo[]
5foo[]
4 foo[]
77
foo[]
5foo[]
4 foo[]
70
foo[]
5foo[]
72 foo[]
73
foo[]
5foo[]
7
foo[]
8/* 1 */
22
foo[]
5/* 1 */
6
foo[]
5/* 1 */
3 foo[]
70
/* 1 */
6
foo[]
4 foo[]
73
foo[]
74
foo[]
75
foo[]
76
foo[]
77
đầu ra.
Giải trình. Trong đoạn mã trên, chúng tôi đang cập nhật đối số của hàm create_Closure với mỗi lệnh gọi. Do đó, chúng tôi nhận được các giá trị khác nhau của i tại các chỉ mục khác nhau
Ghi chú. Có thể hơi khó để có khái niệm về bao đóng cùng một lúc nhưng hãy thử thử nghiệm với bao đóng trong các tình huống khác nhau như để tạo getter/setter, gọi lại, v.v.