this phụ thuộc cách hàm được gọi, không phải nơi định nghĩa (trừ arrow function). Thứ tự ưu tiên:
1. new → this là object mới tạo.
2. call/apply/bind → this là giá trị truyền vào.
3. Method call obj.fn() → this là obj.
4. Gọi trơn fn() → undefined (strict mode) hoặc globalThis.
Arrow function không có this riêng — kế thừa this từ scope bao ngoài (lexical), nên hợp cho callback.
Gắn this thủ công:
- call(thisArg, a, b) — gọi ngay, đối số rời.
- apply(thisArg, [a, b]) — gọi ngay, đối số dạng mảng.
- bind(thisArg) — không gọi ngay, trả về hàm mới đã khóa this.