Chuyển đến nội dung chính
Mô-đun 4 · Bài học 4 trong tổng số 416/32 trong khóa học~12 min
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:

JS
const moltiplicatore = 10;

function moltiplicaPer10(n) {
  return n * moltiplicatore; // reads from the closure
}

moltiplicaPer10(3); // 30

Nhà 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.

JS
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.

JS
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ó

tập thể dục#js.m4.l4.e1
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…
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

tập thể dục#js.m4.l4.e2
Nỗ lực: 0Đang tải…

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ó.

Đang tải trình chỉnh sửa…
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ử