this được quyết định bởi cách một hàm được GỌI, không phải nơi nó được định nghĩa. Có năm quy tắc:
js
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
this được quyết định bởi cách một hàm được GỌI, không phải nơi nó được định nghĩa. Có năm quy tắc:
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
Arrow function không có this riêng — chúng kế thừa this từ scope bao quanh tại thời điểm định nghĩa. Đó là lý do arrow rất hoàn hảo cho callback:
const obj = {
items: [1, 2],
logAll() {
// ✅ arrow kế thừa `this` từ logAll → `this` là obj
this.items.forEach(i => console.log(this.items, i));
// ❌ một hàm thường ở đây sẽ có `this` riêng (undefined) → crash
// this.items.forEach(function (i) { console.log(this.items); });
},
};
Truyền một method làm callback sẽ làm mất binding của nó, vì khi đó nó được gọi theo kiểu thường:
button.addEventListener("click", obj.getX); // ❌ `this` là button
button.addEventListener("click", () => obj.getX()); // ✅ giữ obj
button.addEventListener("click", obj.getX.bind(obj)); // ✅ cũng ổn
Hiểu sai this là một trong những lỗi JS phổ biến nhất.
Cách khắc phục thường là một arrow function hoặc .bind() để khóa this mong muốn.
Thư viện câu hỏi phỏng vấn IT với đáp án chi tiết — từ Junior đến Senior.
Ủng hộ