Le this en JavaScript
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'
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'
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
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
});
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();
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 !
Quelques liens en supplément de ce cours :
https://developpeur-pro.com/cours-javascript-les-bases
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.