đŸ€Ż Qu’est-ce que this ? D’oĂč vient-il, oĂč va-t-il ?

đŸ€Ż Qu’est-ce que this ? D’oĂč vient-il, oĂč va-t-il ?

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Ă© ?

  • sayHi est 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 this depuis 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Ă© ?

  • arrow hĂ©rite de this depuis sayHi
  • sayHi → 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
  • this est 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Ă© ? »

Comments

No comments yet. Why don’t you start the discussion?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile ißaretlenmißlerdir