Giới thiệu Closures trong Javascript

Giới thiệu Closures trong Javascript

Lexical Scope

Để hiểu closures là gì và tại sao chúng là hữu dụng trong lập trình hướng đối tượng, bạn phải bắt
đầu với khái niệm phạm vi biến. Nhớ lại rằng phạm vi quyết định nơi nào một biến hay hàm có thể truy
cập được bên trong code chương trình. Nhiều đoạn scripts đòi hỏi nhiều mức các hàm nested trong đó
các biến được khai báo tại một mức có thể truy cập được đối với tất cả các hàm ở một mức thấp hơn.
Ví dụ, code sau chứa một tập các hàm nested được đặt tên một cách phù hợp outer() và inner(). Khi hàm
outer() được gọi, nó chạy bản thân nó và hàm inner() ghi lại 2 thông điệp trong debugger console.

function outer() {

let msg = “ace of spades”;
function inner() {

console.log(msg);

}

inner();
console.log(“is my card”);

}
// run the outer() function
outer();
// logs “ace of spades”
// logs “is my card”

Chú ý rằng hàm inner() ghi lại nội dung của biến msg mặc dù biến đó được khai báo bên ngoài hàm đó.
Hàm inner() biết cái gì có ý định bởi biến msg vì lexical scope hay static scope trong đó phạm vi các
biến, hàm và các objects khác dựa trên vị trí vật lí của chúng bên trong mã nguồn. Trong trường hợp này,
trình dịch Javasript nhận ra biến msg vì nó là một phần của bối cảnh lớn hơn của hàm outer() cái bao gói
khai báo biến msg và việc tạo hàm inner().
Trình dịch áp dụng lexical scope trong đánh giá tất cả các biến nó gặp, bắt đầu bằng cách tìm kiếm cho một
khai báo biến khớp bên trong hàm bên trong nhất. Nếu không có cái gì được tìm thấy trình dịch di chuyển
ra ngoài tới các hàm mức cao hơn cho đến khi nó tìm thấy khai báo. Nếu không khai báo được tìm thấy ở mọi
mức, trình dịch báo lỗi vì unrecognized variable name. Trong ví dụ này trình dịch tìm kiếm cho khai báo biến
msg bên trong hàm inner(), và không tìm thấy, định vị nó ở mức cao hơn tiếp theo bên trong hàm outer(). Việc
biên dịch một biến và giá trị của nó tồn tại bên trong lexical environment cái bao gói các hàm và biến chúng
sử dụng. Một cố gắng sử dụng một biến tham chiếu bên ngoài lexical environment của nó sẽ trả về một lỗi.

Chia sẻ