Comprendre le mot clé this
Une subtilité en Javascript que dorénavant les dév junior ne connaissent pas
En javascript, le mot clé this peut se comporter de façon inattendue. Pour les personnes qui sont habituées à programmer en Java ou en C++, le mot clé 10 représente l’objet lui-même.
En JavaScript, le mot clé this aussi représente un objet, mais cela dépend de sa position dans le code. Nous allons voir que dans une fonction qui fait appel au mot clé 10, dans un console.log par exemple, le mot clé this représente l’objet dans lequel il se trouve, ou non. Nous allons voir que dans une fonction qui fait appel au mot clé 10, dans un console.log par exemple, le mot clé this représente l’objet dans lequel il se trouve, ou non. Nous allons voir que dans une fonction qui fait appel au mot clé this , dans un console.log par exemple.
"use strict";
let utilisateur = {
nom: "Alice",
direNom: function() {
console.log("dans direNom -> this.nom =", this.nom);
function interne() {
console.log("dans interne -> this.nom =", this.nom);
}
interne();
}
};
utilisateur.direNom();
// sortie
dans direNom -> this.nom = Alice
dans interne -> this.nom = undefined // ou Window.nom si non strict
Pourquoi donc this change de forme?
utilisateur.direNom()
Ici, this est lié à l’objet utilisateur, donc this.nom = "Alice".
Fonction interne()
Même si elle est définie à l’intérieur de direNom, elle est appelée comme une fonction simple (pas comme une méthode d’objet).
→ Dans ce cas, this ne fait plus référence à utilisateur.
- En mode strict,
this=undefined. - En mode non strict,
this=window(dans un navigateur).
En bref la fonction direNom est une propriété de l’objet utilisateur, donc possède un this. La fonction interne() est une fonction non attachée à une propriété de l’objet utilisateur. En strict il vaut undefined, et en non strict il vaut window !
Comment contourner ce piège classique?
Méthode avec that = this
On a le très populaire that = this
"use strict";
let utilisateur = {
nom: "Alice",
direNom: function () {
console.log("dans direNom -> this.nom =", this.nom);
let that = this
function interne() {
console.log("dans interne -> this.nom =", that.nom);
}
interne();
}
};
utilisateur.direNom();
Méthode avec un binding de contexte
Le binding de contexte permet de dire dans le fonction à quoi correspond le this
"use strict";
let utilisateur = {
nom: "Alice",
direNom: function () {
console.log("dans direNom -> this.nom =", this.nom);
function interne() {
console.log("dans interne -> this.nom =", this.nom);
}
// on lie la fonction interne au contexte courant (this = utilisateur)
let interneLie = interne.bind(this);
interneLie();
}
};
utilisateur.direNom();
Notez que l’on déclare une nouvelle variable pour faire le binding
Méthode avec une fonction flèche
Les fonction flèche n’ont pas leur propre this, donc ils héritent du this du parent.
"use strict";
let utilisateur = {
nom: "Alice",
direNom: function () {
console.log("dans direNom -> this.nom =", this.nom);
// fonction fléchée : hérite du this de direNom
const interne = () => {
console.log("dans interne -> this.nom =", this.nom);
};
interne();
}
};
utilisateur.direNom();
A noter que ici on a une fonction définie dans une autre fonction, en programmation fonctionnelle on appelle cela une closure.
Pour aller plus loin :
7 arrow functions tricks to fix this issue



