Closures và Lexical Environment trong Javascript
Bây giờ thẩm định code sau trong đó hàm outer() không gọi hàm inner() nhưng thay vào đó trả về bản
thân hàm như một biến, cái sau đó được lưu giữ trong biến myClosure.
function outer() {
let msg = “ace of spades”;
function inner() {console.log(msg);
}
return inner;
console.log(“is my card”);}
let myClosure = outer();
myClosure();
// logs “ace of spades”
Khi myClosure() được gọi trong dòng code cuối, nó vượt qua hàm outer() hoàn toàn để chỉ chạy hàm inner().
Và mặc dù biến msg được tham chiếu bên ngoài lexical environment của nó, code vẫn làm việc.
Lí do là vì closure, cái được tạo khi một bản sao được tạo một hàm cái bao gồm lexical environment của các
biến sử dụng bên trong hàm. Khi hàm inner() được lưu giữ trong biến myClosure, một closure được tạo trong đó
lexical environment cái định nghĩa ý nghĩa của biến msg cũng được copy. Closure bao gói mọi thứ về hàm, bao gồm
bối cảnh của nó bên trong mã nguồn lớn hơn. Đó là tại sao biến msg vẫn có ý nghĩa bên trong biến myClosure.
Vì một closure copy lexical environment của một hàm, nó lấy nhiều bộ nhớ hơn. Sử dụng quá các closures có thể
dẫn đến tiêu thụ bộ nhớ vượt tải, làm hỏng hiệu suất hệ thống. Bạn nên sử dụng các closures chi khi cần thiết để
giành mục tiêu lập trình.