Pourquoi `this` est `undefined` dans ma méthode passée en callback ?
posée 4 months ago156 vuesfr
J'ai une classe :
class Compteur {
count = 0;
incr() { this.count++; }
}
const c = new Compteur();
button.addEventListener('click', c.incr);
Au clic : TypeError: Cannot read properties of undefined (reading 'count'). Pourquoi this est perdu ?
Diagnostic IA
Généré par IA. Ce n'est pas une réponse — la communauté ci-dessous le confirme ou le corrige. Vérifiez toujours avant de vous y fier.
1 réponse
En JavaScript, this dépend de la façon dont la fonction est appelée, pas de l'endroit où elle est définie. En passant c.incr, tu passes la fonction seule, détachée de c. addEventListener l'appelle ensuite avec this = l'élément (ou undefined en mode strict dans une classe).
Trois solutions :
// 1. bind
button.addEventListener('click', c.incr.bind(c));
// 2. fonction fléchée à l'appel
button.addEventListener('click', () => c.incr());
// 3. champ de classe en fonction fléchée (this lexical)
class Compteur {
count = 0;
incr = () => { this.count++; };
}
La solution 3 est la plus pratique si la méthode sert souvent de callback. Elle crée une fonction par instance, ce qui est négligeable dans la plupart des cas.
Connectez-vous pour dire si ça a marché.
Sign in and verify your email to post an answer.