Bài học theo mô-đun (4/4)
Đóng cửa và phạm vi
closure là một hàm "ghi nhớ" các biến trong phạm vi mà nó được xác định, ngay cả sau khi phạm vi đó đã kết thúc. Nó trông giống như phép thuật nhưng đó là hệ quả trực tiếp của các quy tắc phạm vi.
Chuỗi phạm vi
Một hàm có thể đọc các biến được khai báo bên ngoài chính nó, đi lên theo chuỗi phạm vi:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // reads from the closure
}
moltiplicaPer10(3); // 30Nhà máy chức năng
Mẫu điển hình nhất: một hàm trả về một hàm khác, "được tùy chỉnh" bằng các thông số nó nhận được.
function creaSaluto(prefisso) {
return function (nome) {
return `${prefisso}, ${nome}!`;
};
}
const ciao = creaSaluto('Ciao');
const buongiorno = creaSaluto('Buongiorno');
ciao('Anna'); // 'Ciao, Anna!'
buongiorno('Marco'); // 'Buongiorno, Marco!'Mỗi lệnh gọi tới creaSaluto tạo ra một phạm vi riêng với prefisso riêng.
Bộ đếm với trạng thái riêng tư
Ví dụ cổ điển: một bao đóng để giữ bộ đếm mà không để lộ nó ra bên ngoài.
function creaContatore() {
let n = 0;
return function () {
n++;
return n;
};
}
const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3
const c2 = creaContatore();
c2(); // 1 ← isolated state!n là riêng tư: không ai ngoài vùng đóng có thể đọc hoặc sửa đổi nó.
Hãy thử nó
Triển khai một `makeCounter()` nhà máy trả về một hàm: mỗi lệnh gọi hàm trả về một số nguyên lũy tiến bắt đầu từ 1. Các bộ đếm khác nhau phải độc lập.
Hiển thị gợi ý
Khai báo n bằng let bên trong makeCounter, sau đó trả về một hàm thực hiện ++n.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Triển khai `makeAdderWith(base)` trả về một hàm: cho một số n, nó trả về base + n. Mỗi bộ cộng ghi nhớ cơ sở riêng của nó.
Hiển thị gợi ý
trả về hàm mũi tên sử dụng base từ tham số bên ngoài.
Giải pháp khả dụng sau 3 lần thử