Function Declaration (Khai báo hàm)
Được hoisting (nâng lên đầu scope) – có thể gọi trước khi khai báo.
function sayHello(name, age) {
document.write(name + " is " + age + " years old.");
}
sayHello("An", 25); // Hợp lệ
Function Expression (Biểu thức hàm)
Không được hoisting – phải định nghĩa trước khi dùng. Có thể là anonymous hoặc named.
// Anonymous
var greet = function(name) {
return "Hello " + name;
};
// Named (giúp debug stack trace)
var factorial = function fact(n) {
return n <= 1 ? 1 : n * fact(n - 1);
};
So sánh nhanh
| Đặc điểm | Declaration | Expression |
|---|---|---|
| Hoisting | Có | Không |
| Dùng trước khai báo | Được | Lỗi ReferenceError |
| Gán cho biến | Không trực tiếp | Được |
| Callback/IIFE | Khó khăn | Dễ dàng |
Khuyến nghị hiện đại
- Ưu tiên Function Expression (arrow function) cho callback, method.
- Dùng Declaration cho hàm tiện ích toàn cục cần hoisting.
- Tránh Function Declaration trong block (if, for) – hành vi khác nhau giữa strict/sloppy mode.