
Written on 27th June 2024 by Carter Phan.
Closures là những functions tham chiếu các biến độc lập (Free variables). Nói cách khác, function được định nghĩa trong closures nhớ môi trường mà nó được tạo ra.
Ví dụ 1
function numberGenerator() {
// Local “free” variable that ends up within the closure
var num = 1;
function checkNumber() {
console.log(num);
}
num++;
return checkNumber;
}
var number = numberGenerator();
number(); // 2
Trong ví dụ trên, hàm numberGenerator() tạo ra một biến local num và checkNumber() (một hàm in ra num trong console). Hàm checkNumber() không có bất kỳ biến local nào trong nó. Tuy nhiên, nó có quyền truy cập vào các biến bên ngoài function, bởi vì numberGenerator() là một closure. Do đó, nó có thể sử dụng biến num được khai báo trong numberGenerator() để log num trong console sau khi numberGenerator() được trả lại.
Ví dụ 2
function sayHello() {
var say = function() { console.log(hello); }
// Local variable that ends up within the closure
var hello = 'Hello, world!';
return say;
}
var sayHelloClosure = sayHello();
sayHelloClosure(); // ‘Hello, world!’
Chú ý, biến hello được khai báo sau anonymous function nhưng vẫn có thể truy cập biến hello. Điều này là do biến hello đã được khai báo trong function scope tại thời điểm được tạo ra, làm cho nó có sẵn khi anonymous function được thực thi.
Là một khái niệm trừu tượng được sử dụng bởi đặc tả ECMAScript theo dõi và đánh giá thời gian chạy của code. Nó có thể là global context trong đó code của bạn chạy lần đầu tiên hoặc khi luồng thực hiện vào một function body.
Mỗi một function đều có một execution context, trong đó bao gồm một môi trường đem lại ý nghĩa cho các biến bên trong hàm đó, và một tham chiếu đến môi trường parent của nó. Một tham chiếu đến môi trường parent làm cho các biến trong phạm vi parent khả dụng cho tất cả các functions bên trong, bất kể các functions bên trong được gọi ở bên ngoài hoặc bên trong phạm vi mà nó được tạo ra.
Vì vậy, có vẻ như chức năng nhớ của môi trường này (hoặc phạm vi) bởi vì hàm nghĩa đen đó là một tham chiếu đến môi trường (và các biến được định nghĩa trong môi trường đó).
var x = 10;
function foo() {
var y = 20; // free variable
function bar() {
var z = 15; // free variable
return x + y + z;
}
return bar;
}
var test = foo();
test(); // 45