Giống nhiều ngôn ngữ khác, JavaScript có biến. Biến là container (chứa) có tên. Đặt dữ liệu vào và tham chiếu bằng tên. Từ khóa var dùng để khai báo biến.
Khai báo biến
<script> var money; var name; </script>
Khai báo nhiều biến cùng một var:
<script> var money, name; </script>
Variable Initialization (Khởi tạo)
Gán giá trị cho biến gọi là khởi tạo. Có thể làm tại khai báo hoặc sau:
// Tại khai báo
var money = 1000;
var name = "John";
// Sau khi khai báo
var money;
money = 1000;
var vs let vs const (ES6)
| Đặc điểm | var | let | const |
|---|---|---|---|
| Scope | Function-scoped | Block-scoped | Block-scoped |
| Hoisting | Có (initialized = undefined) | Có (TDZ - uninitialized) | Có (TDZ) |
| Re-declare | Cho phép | Không | Không |
| Re-assign | Cho phép | Cho phép | Không (binding) |
| Global property | Tạo property trên window/globalThis | Không | Không |
Vấn đề của var
// 1. Function scope - leak ra block
if (true) {
var x = 1;
}
console.log(x); // 1 - x leak ra ngoài block!
// 2. Hoisting gây bug
console.log(y); // undefined (không error - confusing)
var y = 5;
// 3. Loop closure bug
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // 3, 3, 3
}
// Fix: dùng let
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // 0, 1, 2
}
Khuyến nghị hiện đại
- Mặc định dùng
const(bất biến binding). - Cần reassign →
let. - Tránh
vartrừ khi maintain legacy code hoặc cần function-scope/hoisting hành vi cụ thể. - ESLint:
no-var,prefer-const.