this est déterminé par comment une fonction est APPELÉE, pas où elle est définie. Il existe cinq règles :
js
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
this est déterminé par comment une fonction est APPELÉE, pas où elle est définie. Il existe cinq règles :
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
Les arrow functions n'ont pas de propre this — elles l'héritent de la portée englobante au moment de la définition. C'est pourquoi les arrows sont parfaites pour les callbacks :
const obj = {
items: [1, 2],
logAll() {
// ✅ arrow inherits `this` from logAll → `this` is obj
this.items.forEach(i => console.log(this.items, i));
// ❌ a regular function here would have its own `this` (undefined) → crash
// this.items.forEach(function (i) { console.log(this.items); });
},
};
Passer une méthode en tant que callback perd sa liaison, car elle est alors appelée simplement :
button.addEventListener("click", obj.getX); // ❌ `this` is the button
button.addEventListener("click", () => obj.getX()); // ✅ keeps obj
button.addEventListener("click", obj.getX.bind(obj)); // ✅ also fine
Méconnaître this est l'un des bugs JS les plus courants.
La correction est généralement une arrow function ou .bind() pour verrouiller le this prévu.