Le this en JavaScript

opérateur this en javascript image

 

Le mot-clé this en JavaScript est l’un des concepts les plus important en programmation et parfois déroutants du langage Javascript .

Il joue un rôle dans la gestion du contexte d’exécution, c’est-à-dire l’environnement dans lequel une fonction est appelée, il fonctionne différemment par rapport à d’autres langages de programmation.

Dans cette article, voyons en détail comment this fonctionne, les pièges courants à éviter et des techniques pour maîtriser son utilisation.

 

Tout d’abord Qu’est-ce que this ?

 
 

En JavaScript, this fait référence à l’objet dans le contexte d’exécution actuel.

Il est important de noter que la valeur de this dépend de la façon dont une fonction est appelée, et non de la manière dont elle est définie.

 

Contexte global

 

Lorsqu’une fonction est appelée dans le contexte global, this fait référence à l’objet global. Dans un navigateur, il s’agit de l’objet window.

 

 

 

function contexteThis() {
  console.log(this);
}

contexteThis(); // Affiche l'objet global 'window'

 
 
 

Méthodes d’objet

 
 

Lorsque this est utilisé dans une méthode d’objet, il fait référence à l’objet auquel la méthode appartient.

 

 

const person = {
  name: 'Développeur Pro',
  hello: function() {
    console.log('Hello, ' + this.name);
  }
};

person.hello(); // Affiche 'Hello, Développeur Pro'


 
 
 

Fonctions constructrices

 
 

Dans une fonction constructeur, this fait référence à l’instance de l’objet créée par cette fonction.

 

 

function Car(make, model) {
  this.make = make;
  this.model = model;
}

const myCar = new Car('Toyota', 'Corolla');
console.log(myCar.make); // Affiche 'Toyota'

 
 
 

Fonctions fléchées

 
 

Les fonctions fléchées introduites avec ES6 ont un comportement particulier pour this. Elles ne possèdent pas leur propre this, mais héritent du this de leur contexte de création.

 
 
 

const person = { name: 'Anis', hello: function() { const innerFunction = () => { console.log('Hello, ' + this.name); }; innerFunction(); } }; person.hello(); // Affiche 'Hello, Anis'
 
 
 
 

Les pièges courants

 
 

Perte de contexte

 
 

Un piège classique est la perte de contexte lorsqu’une méthode est passée comme callback. Par exemple :

 
 
const person = {
  name: 'Alberto',
  greet: function() {
    console.log('Hello, ' + this.name);
  }
};

setTimeout(person.greet, 1000); // Affiche 'Hello, undefined'

 
 
Ici, this ne fait pas référence à person comme on pourrait s’y attendre. Pour résoudre ce problème, utilisez bind ou une fonction fléchée :
 
 
setTimeout(person.greet.bind(person), 1000); // Affiche 'Hello, Alberto'

 
 
 

Utilisation dans des objets littéraux

 

Les méthodes définies dans des objets littéraux ont un comportement prévisible, mais lorsque vous manipulez des méthodes dynamiquement, soyez prudent :

 
 
const obj = {
  value: 42,
  getValue: function() {
    return this.value;
  }
};

const anotherObj = { getValue: obj.getValue };
console.log(anotherObj.getValue()); // Affiche 'undefined'

 
 
 

Quelques Techniques avancées

 
 

Il est crucial de comprendre comment les binding de this fonctionnent dans des situations plus complexes et d’apprendre à manipuler les fonctions avec des méthodes comme call, apply, et bind.

Ces méthodes vous permettent de contrôler explicitement le contexte d’exécution de vos fonctions voir l’article sur les callback.

 

Le mot-clé this en JavaScript est puissant, mais il comporte certaines limites en raison de son comportement contextuel.

Comprendre ces limites est indispensable pour éviter les pièges et les comportements inattendus.

Dans cette section, voyons les principales limitations de this dans différents contextes, ainsi que les solutions pour surmonter ces obstacles.

 

 

D’autres Limites de this dans différents contextes et solutions

 
 
 

1. Perte de Contexte dans les Callbacks

 

L’un des problèmes les plus courants avec this survient lorsque vous passez une méthode comme callback. Dans ce cas, le contexte de this est souvent perdu, car la méthode n’est plus appelée sur l’objet auquel elle appartient.

 

Exemple :

 
 
const person = {
  name: 'John',
  greet: function() {
    console.log('Hello, ' + this.name);
  }
};

setTimeout(person.greet, 1000); // Affiche 'Hello, undefined'

 
 
Solution : Utiliser bind, une fonction fléchée ou une variable intermédiaire.
 
 
// Utilisation de bind
setTimeout(person.greet.bind(person), 1000); // Affiche 'Hello, John'

// Utilisation d'une fonction fléchée
setTimeout(() => person.greet(), 1000); // Affiche 'Hello, John'

 
 
 

2. Quand le Contexte Global est Non Souhaité

 
 

Dans le contexte global (ou lorsqu’une fonction n’est pas appelée en tant que méthode d’objet), this fait référence à l’objet global (window dans les navigateurs, global dans Node.js).

Cela peut entraîner des effets secondaires indésirables.

 

Exemple :

 
 
function showThis() {
  console.log(this);
}

showThis(); // Affiche 'window' dans un navigateur

 
 
 
Solution : Toujours appeler les fonctions dans le bon contexte, ou utiliser strict mode (use strict), qui force this à être undefined si la fonction n’est pas appelée comme méthode d’objet.
 
 
 
'use strict';

function showThis() {
  console.log(this);
}

showThis(); // Affiche 'undefined' en mode strict

 
 
 

3. Fonctions Fléchées et Héritage du Contexte

 
 

Les fonctions fléchées n’ont pas leur propre this. Elles héritent du this du contexte où elles ont été définies. Cela peut être limitant lorsque vous avez besoin de créer une fonction avec son propre contexte.

 

Exemple :

 
const person = {
  name: 'Sarah',
  greet: function() {
    const innerFunc = () => {
      console.log('Hello, ' + this.name);
    };
    innerFunc();
  }
};

person.greet(); // Affiche 'Hello, Sarah'

 
 

Dans ce cas, la fonction fléchée est utile, mais elle pourrait poser problème si vous avez besoin d’un nouveau contexte.

 

Solution : Utiliser des fonctions classiques (non fléchées) si vous avez besoin de créer un nouveau contexte pour this.

 
 
const person = {
  name: 'Sarah',
  greet: function() {
    function innerFunc() {
      console.log('Hello, ' + this.name);
    }
    innerFunc.call(this); // Utilisation de 'call' pour fixer 'this'
  }
};

person.greet(); // Affiche 'Hello, Sarah'

 
 
 

4. this dans les Événements DOM

 

Dans les gestionnaires d’événements DOM, this fait référence à l’élément sur lequel l’événement s’est produit.

Cela peut parfois créer de la confusion si vous essayez d’accéder à des propriétés de l’objet contenant le gestionnaire.

 

Exemple :

 
 
const button = document.querySelector('button');

button.addEventListener('click', function() {
  console.log(this); // Affiche l'élément bouton
});

 
 Solution : Utiliser des fonctions fléchées si vous voulez que this fasse référence à l’objet parent.
 
 
const obj = {
  name: 'Button Object',
  logName: function() {
    const button = document.querySelector('button');
    button.addEventListener('click', () => {
      console.log(this.name); // Affiche le name ici 'Button Object'
    });
  }
};

obj.logName();

 
 
 

5. this dans les Fonctions Asynchrones

 
 

Lors de l’utilisation de fonctions asynchrones (comme les setTimeout, setInterval ou les promesses), this peut ne pas se comporter comme prévu si vous essayez d’accéder à des propriétés d’instance.

 

Exemple :

 
 
const car = {
  model: 'Tesla',
  showModel: function() {
    setTimeout(function() {
      console.log(this.model); // Affiche 'undefined'
    }, 1000);
  }
};

car.showModel();

 
 
 Solution : Utiliser bind, ou des fonctions fléchées ou stocker this dans une variable intermédiaire.
 
 
 
// Utilisation d'une fonction fléchée
const car = {
  model: 'Tesla',
  showModel: function() {
    setTimeout(() => {
      console.log(this.model); // Affiche 'Tesla'
    }, 1000);
  }
};

car.showModel();

 
 
 

Pourquoi donner des exemples de this avec setTimeout et des fonctions classiques ?

 
 

La confusion vient probablement du fait que les exemples que j’ai fournis démontrent une situation courante en JavaScript où this peut se comporter de manière inattendue.

Il faut savoir que historiquement, avant l’introduction des fonctions fléchées avec ES6, les développeurs utilisaient souvent des fonctions classiques (appelées aussi « fonctions anonymes ») pour les callbacks, y compris avec setTimeout.

Voici pourquoi cette pratique existait et pourquoi elle est encore parfois mentionnée.

 

Comprendre l’Historique et Contexte

 
 

Avant ES6 (ECMAScript 2015), JavaScript ne disposait pas de fonctions fléchées, et les développeurs utilisaient des fonctions classiques pour les callbacks, y compris dans setTimeout.

Cependant, ces fonctions classiques avaient un inconvénient majeur : le contexte de this pouvait changer en fonction de l’endroit où la fonction était appelée, ce qui créait de nombreux problèmes.

 

Exemple typique d’une fonction classique avec setTimeout :

 
 
const car = {
  model: 'Toyota',
  showModel: function() {
    setTimeout(function() {
      console.log(this.model); // Affiche 'undefined'
    }, 1000);
  }
};

car.showModel();

 
 

Dans cet exemple, this à l’intérieur de la fonction classique fait référence à l’objet global, non pas à l’objet car, ce qui explique pourquoi this.model est undefined.

 

Que faisait un développeur Avant ES6 : Voici les Solutions pour Contourner ce Problème

 

Avant l’introduction des fonctions fléchées, les développeurs devaient utiliser des techniques comme bind, des variables intermédiaires, ou des méthodes comme call ou apply pour forcer le bon contexte de this :

 

  • Utilisation de bind :
setTimeout(function() {
  console.log(this.model); // Affiche 'Toyota'
}.bind(this), 1000);

 
  • Ou le Stockage de this dans une variable intermédiaire :
 
 
const self = this;
setTimeout(function() {
  console.log(self.model); // Affiche 'Toyota'
}, 1000);

 
 
 

Depuis l’Introduction des Fonctions Fléchées avec ES6

 

Avec ES6, les fonctions fléchées ont été introduites et ont résolu ce problème en héritant du this du contexte lexical où elles sont créées.

Cela a considérablement simplifié l’écriture de callbacks comme ceux utilisés dans setTimeout.

 

Exemple avec une fonction fléchée :

 
 
const car = {
  model: 'Tesla',
  showModel: function() {
    setTimeout(() => {
      console.log(this.model); // Affiche 'Tesla'
    }, 1000);
  }
};

car.showModel();

 
 
 

Alors Pourquoi Mentionner les Fonctions Classiques dans ces cas ?

 
 

Bien que les fonctions fléchées soient maintenant la norme pour les callbacks, il est toujours utile de comprendre les anciennes techniques pour :

 

  • Travailler avec du code JavaScript plus ancien ou legacy.
  • Comprendre le fonctionnement interne de JavaScript, notamment le contexte de this.
  • Être capable de lire et de comprendre des exemples de code dans la documentation ou les articles écrits avant ES6.
 

 

 

Ce qu’il faut retenir :

 

Différents types de code fonctionnent bien pour démontrer un cas de perte de contexte de this.

 Cependant, il est essentiel de comprendre que la solution à ce problème réside dans le contrôle du contexte de this, en utilisant des techniques comme bind, les fonctions fléchées ou des variables intermédiaires.

Ces concepts sont fondamentaux pour maîtriser le comportement asynchrone en JavaScript et éviter les erreurs courantes liées à this.

 

this est un concept central en JavaScript, mais il n’est pas exempt de limitations et de comportements inattendus.

Heureusement, avec les bonnes techniques, tu peux surmonter ces obstacles.

En utilisant des méthodes comme bind, les fonctions fléchées, ou encore le mode strict, tu peux maîtriser le contexte de this et éviter aussi ces autres subtilités.

 

Ces concepts complémentaires de this enrichiront ta compréhension du langage Javascript.

Par exemple, le modèle de gestion de this en JavaScript, en particulier lorsqu’il est combiné avec les promesses et les fonctions asynchrones, ouvre la porte à des techniques avancées de gestion d’état et de contexte.

 

 

Garantir ton avenir c’est aussi l’apprentissage de JavaScript pour cela :

 

Je t’offre un Guide Bonus Exclusif

 

Développe tes compétences, avec ce Guide Bonus Exclusif rien que pour Toi !

Voici un guide complet sur le JavaScript, où tu verras des techniques pour performer en programmation Js.

Ce guide te permettra de perfectionner tes compétences et de devenir un expert JavaScript. Ne le rate pas et développe ton expertise !

 

En adoptant ce qu’il contient, tu rends ton apprentissage de JavaScript plus performant avec une plus grande facilité tous les jours . Voici de quoi enrichir tout de suite ton savoir-faire ? Le guide complet t’attend !

 
 

Rejoignez notre Newsletter et Restez Informé !

Vous souhaitez rester à jour avec les dernières tendances et actualités du monde du développement et le métier de développeur. Comment devenir développeur pro ? Rejoignez notre newsletter pour obtenir un accès exclusif à du contenu premium, des astuces de codage, des mises à jour sur les nouvelles fonctionnalités et bien plus encore !

Avantages de l’Inscription

  • Restez Informé: Recevez des articles informatifs sur les dernières avancées et les meilleures pratiques de codage et les softkills.
  • Promos Exclusives: Accédez à des formations détaillés et à des exemples de code pour améliorer vos compétences en programmation.
  • Aperçus des Nouveautés: Soyez parmi les premiers à découvrir les nouvelles fonctionnalités et les frameworks émergents dans l’écosystème du développement FrontEnd et Backend.
  • Communauté Engagée: Rejoignez une communauté passionnée de développeurs et partagez vos idées, questions et expériences.

Comment S’Inscrire

C’est simple et rapide ! Remplissez le formulaire d’inscription avec votre adresse e-mail et cliquez sur « S’Inscrire ». Vous recevrez régulièrement notre newsletter dans votre boîte de réception.


L’inscription à notre newsletter est un moyen idéal de rester informé et de progresser dans le domaine de la programmation et du développement pour devenir un développeur professionnel ou une développeuse pro.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *