Scope và scope chain trong javascript
Nguyễn Dương 20-06-2024Scope có thể hiêu đơn giản là phạm vi truy cập của biến. Đối với javascript thì:
- Scoping kiểm soát cách JS Engine sắp xếp và truy cập các biến trong chương trình.
- Lexical scoping là cách tổ chức và truy cập các biến hoàn toàn bị vị trí của các hàm và các khối trong code kiểm soát. Ví dụ một hàm được viết trong một hàm khác có quyền truy cập các biến của hàm cha. Scope bị ảnh hưởng bởi vị trí mà chúng ta đặt các hàm và khối code của mình.
- Scope là không gian hoặc môi trường khai báo một biến nhất định.
- Scope của một biến là toàn bộ khu vực code có thể truy cập vào biến đó.
Trong JS có 3 loại scope
- Global Scope là các top-level code, các biến được khai báo bên ngoài bất kỳ hàm hoặc khối nào. Các biến này có thể được truy cập ở mọi nơi trong chương trình.
- Function Scope: mỗi một hàm đều tạo một scope và các biến khai báo bên trong phạm vi của hàm đó chỉ có thể được truy cập bên trong hàm. Đây còn được gọi là local scope.
- Block Scope: Từ ES6, các khối block cũng tạo ra một scope, code block là code tất cả mọi thứ nằm trong dấu ngoặc nhọn {} (ví dụ: khối lệnh if, vòng lặp for). Giống function scope, tất cả các biến được khai báo trong block chỉ có thể được truy cập bên trong block đó, không thể truy cập từ bên ngoài.
Khác biệt giữa function scope và block scope là block scope chỉ áp dụng cho các biến được khai báo bằng let và const. Còn var là function scope.
Ngoài ra, tất cả các scope đều có quyền truy cập vào các biến từ các scope bên ngoài của chúng.
Scope chain là sự liên kết giữa local scope với scope bao bên ngoài nó.
- Nếu scope cần sử dụng một biến nào đó mà không tìm thấy trong scope hiện tại nó sẽ tra cứu trong scope chain để tìm xem liệu có tìm thấy biến đó từ một trong các parent scope không. Nếu có biến đó sẽ được sử dụng, nếu không tìm thấy nó sẽ báo lỗi. Quá trình này gọi là Tra cứu biến.
Mối liên hệ giữa CallStack, EC, variable enviroment và scope
- Call stack chứa các execution context, mỗi execution context đại điện cho mỗi hàm đúng theo thứ tự mà chúng được gọi.
- Execution context bao gồm môi trường biến.
- Các biến có sẵn trong Global Scope chính xác là các biến được lưu trữ trong môi trường biến của Global Execution Context.
- Các biến có trong các function scope cũng là các biến được lưu trữ trong môi trường biến của Execution Context của từng hàm.
- Scope chain đóng vai trò để các function scope có quyền truy cập vào các parent scope của nó.
- Scope chain không liên quan đến thứ tự hàm được gọi, nó chỉ liên quan đến vị trí của hàm trong code.
- Nói cách khác scope chain không liên quan gì đến thứ tự của execution context trong call stack.
- Scope chain của một scope tương đương với việc cộng tất cả các môi trường biến của tất cả các parent scope lại với nhau.
- Scope chain được xây dựng bên trong Javascript Engine.