Scope (phạm vi) xác định phạm vi mà biến có thể truy cập được. Nói cách khác, nó cho biết biến có thể được sử dụng ở những phần nào của code.
JavaScript có 3 loại scope:
- Block Scope (Phạm vi khối)
- Function Scope (Phạm vi hàm)
- Global Scope (Phạm vi toàn cục)
1. Block Scope (Phạm vi khối).
- ES6 (2015) trở về trước, JavaScript chỉ có Global Scope (Phạm vi toàn cục) và Function Scope (Phạm vi hàm).
- ES6 giới thiệu 2 từ khóa mới quan trọng là
let
vàconst
cho phép tạo Block Scope (Phạm vi khối) trong JavaScript. - Biến được khai báo bên trong một khối
{}
chỉ có thể truy cập được từ bên trong khối đó:
{
let x = 2;
}
// x không thể được sử dụng ở đây (bên ngoài khối)
Biến được khai báo bằng từ khóa var
không có block scope:
{
var x = 2;
}
// x CÓ THỂ được sử dụng ở đây (bên ngoài khối)
2. Function Scope (Phạm vi hàm).
- Biến được khai báo bên trong một hàm JavaScript, trở thành biến cục bộ (local variable) của hàm đó.
- Biến cục bộ chỉ có thể truy cập được từ bên trong hàm.
function myFunction() {
let carName = "Volvo";
// Biến carName có thể được sử dụng ở đây
}
// Biến carName không thể được sử dụng ở đây
3. Global Scope (Phạm vi toàn cục).
- Biến được khai báo bên ngoài bất kỳ hàm nào, trở thành biến toàn cục (global variable).
- Biến toàn cục có thể truy cập được từ bất kỳ phần nào của chương trình JavaScript.
let carName = "Volvo";
// Biến carName có thể được sử dụng ở đây
function myFunction() {
// Biến carName cũng có thể được sử dụng ở đây
}
Tổng hợp.
let
vàconst
tạo Block Scope trong ES6.- Biến bên trong một hàm có Function Scope.
- Biến bên ngoài hàm có Global Scope.
Một số lưu ý quan trọng:
- Automatic Global: Nếu bạn gán giá trị cho một biến chưa được khai báo, nó sẽ tự động trở thành biến toàn cục.
- Strict Mode: Chế độ Strict Mode trong các trình duyệt hiện nay sẽ không tự động gán biến chưa khai báo thành biến toàn cục.
- Global Variables in HTML: Với JavaScript, phạm vi toàn cục là môi trường JavaScript. Trong HTML, phạm vi toàn cục là đối tượng window.
- Hạn chế sử dụng biến toàn cục: Tránh tạo biến toàn cục trừ khi bạn thực sự cần. Biến toàn cục có thể ghi đè lên các biến hoặc hàm khác.
Tạm kết.
Hiểu đúng về Scope trong JavaScript sẽ giúp bạn viết code sạch hơn, dễ bảo trì và tránh những lỗi không đáng có.