Un voyage en profondeur dans le personnage le plus dĂ©routant de JavaScript đ”âđ«
Toute personne qui apprend JavaScript a déjà vécu cette scÚne classique :
« OK, jâai compris this. »
(Ajoute un event listener)
« Non⊠en fait non. »
Parce que this est :
- Pas fixe
- Pas global (mĂȘme si on le croit parfois)
- Pas dĂ©terminĂ© par lâendroit oĂč il est Ă©crit
- Déterminé par la façon dont il est appelé
En bref :
this est le personnage camĂ©lĂ©on de JavaScript đŠ
đ„ LA RĂGLE LA PLUS IMPORTANTE
(Lis ceci avant dâaller plus loin)
this nâest pas dĂ©terminĂ© par lâendroit oĂč il est Ă©crit,
mais par COMMENT il est appelé.
Cette phrase est :
- Le résumé de cet article
- Le secret de
this - La cause de 90 % des bugs liĂ©s Ă
this
Maintenant, dĂ©cortiquons tout ça Ă©tape par Ă©tape, avec plein dâexemples đ
đ 1ïžâŁ this dans le scope global (version navigateur)
console.log(this);
đ€ RĂ©sultat (Navigateur) :
window
đ§ Pourquoi ?
- Dans les navigateurs, lâobjet global est
window - Dans le scope global,
thisâwindow
this.alert("Hello!");
Câest exactement la mĂȘme chose que :
window.alert("Hello!");
đ Astuce pratique :
- Tout ce qui est dĂ©clarĂ© globalement est attachĂ© Ă
window - Câest pour ça que
this === window
â ïž Note Node.js :
Dans Node, this global vaut {} (un objet vide).
Mais ici, on reste orientés frontend.
đ§âđŒ 2ïžâŁ this dans les fonctions classiques (le premier piĂšge â ïž)
function showThis() {
console.log(this);
}
showThis();
đ€ RĂ©sultat :
window
đ”âđ« « Mais on est dans une fonction ! »
Oui, mais :
- La fonction est appelée toute seule
- Elle nâappartient Ă aucun objet
Donc JavaScript dit :
« Pas de propriétaire ? OK, je la rattache au global. »
đ RĂšgle :
Si une fonction classique est appelĂ©e de façon indĂ©pendante,this â objet global
đŹ Exemple encore plus dĂ©routant
const fn = function () {
console.log(this);
};
fn();
MĂȘme rĂ©sultat :
window
đĄ Parce que :
- La façon dont la fonction est dĂ©finie nâa pas dâimportance
- La façon dont elle est appelée en a
đ§âđ€âđ§ 3ïžâŁ this comme mĂ©thode dâun objet (lĂ oĂč tout devient logique)
const user = {
name: "Cansu",
age: 28,
sayHi() {
console.log(this.name);
}
};
user.sayHi();
đ€ RĂ©sultat :
Cansu
đ§ Que sâest-il passĂ© ?
sayHiest une méthode- Elle est appelée avec un
. thisâ lâobjet Ă gauche du point
Donc :
this === user
đ RĂšgle dâor #2 :
Si câest appelĂ© comme object.method(),this â cet objet
đ 4ïžâŁ MĂȘme fonction, this diffĂ©rent (celui qui appelle gagne)
function showName() {
console.log(this.name);
}
const user1 = { name: "Ali", showName };
const user2 = { name: "Cansu", showName };
user1.showName(); // Ali
user2.showName(); // Cansu
đ€Ż MĂȘme fonction, rĂ©sultats diffĂ©rents !
Parce que :
- La fonction est la mĂȘme
- Lâappelant est diffĂ©rent
đ RĂšgle cruciale :
this ne se soucie pas de ce quâest la fonction
Il se soucie de qui lâappelle
đč 5ïžâŁ this dans les arrow functions (TRĂS important)
Les arrow functions :
- Ne créent pas leur propre
this - Héritent de
thisdepuis le scope parent
â Utilisation courante mais incorrecte
const user = {
name: "Cansu",
sayHi: () => {
console.log(this.name);
}
};
user.sayHi();
đ€ RĂ©sultat :
undefined
đ± Pourquoi ?
- Arrow function â pas de
this - Scope parent â global
window.nameâundefined
đ RĂšgle :
Nâutilise PAS une arrow function comme mĂ©thode dâobjet
â Bonne utilisation des arrow functions
const user = {
name: "Cansu",
sayHi() {
const arrow = () => {
console.log(this.name);
};
arrow();
}
};
user.sayHi();
đ§ Que sâest-il passĂ© ?
arrowhĂ©rite dethisdepuissayHisayHiâuser- RĂ©sultat â đŻ
đ€ RĂ©sultat :
Cansu
đ§Č 6ïžâŁ call, apply, bind â forcer this
đč call
function greet() {
console.log(this.name);
}
const user = { name: "Cansu" };
greet.call(user);
đ€ RĂ©sultat :
Cansu
đ§ call :
- Tu choisis explicitement
this - La fonction sâexĂ©cute immĂ©diatement
đč apply (le cousin de call)
greet.apply(user);
Différence :
- Les arguments sont passés sous forme de tableau
đč bind (le plus professionnel)
const boundGreet = greet.bind(user);
boundGreet();
đ§ bind :
- Retourne une nouvelle fonction
thisest fixé définitivement- TrÚs utilisé dans les events et les callbacks
đ±ïž 7ïžâŁ Event listeners + this (la vraie vie !)
button.addEventListener("click", function () {
console.log(this);
});
đ€ RĂ©sultat :
<button>...</button>
đ§ Pourquoi ?
- Fonction classique
thisâ lâĂ©lĂ©ment qui dĂ©clenche lâĂ©vĂ©nement
â Si tu utilises une arrow function
button.addEventListener("click", () => {
console.log(this);
});
đ€ RĂ©sultat :
window
đ Dans les event listeners :
- Besoin de
thisâ fonction classique - Pas besoin de
thisâ arrow function OK
đš Erreurs les plus frĂ©quentes (Alerte rouge đš)
â Utiliser des arrow functions comme mĂ©thodes
â Traiter this comme une variable
â Dire « ça dĂ©pend de lâendroit oĂč câest dĂ©fini »
â Deviner sans faire console.log(this) đ
đ§© Ultimate Cheat Sheet (Ă sauvegarder)
đ Scope global â window
đ§âđŒ Fonction classique â dĂ©pend de lâappel
đ§âđ€âđ§ MĂ©thode dâobjet â lâobjet
đč Arrow function â pas de this, hĂ©rite
đ§Č call/apply/bind â tu choisis this
đ±ïž Event listener â la fonction classique gagne
đŻ Mot de la fin (si tu lis ça, tu es prĂȘt·e)
this nâest :
- Pas difficile
- Juste mal expliqué
Une fois la logique comprise, tout sâassemble comme un puzzle đ§©
Souviens-toi :
this ne demande pas « Qui suis-je ? »
Il demande « Qui mâa appelĂ© ? »

