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.