Le mot clé this en javascript sert dans 3 contextes différents, et son comportement diffère selon les contexte.
Contenu
le mot clé this dans une classe
C’est sans doute le plus facile à appréhender, car c’est comme dans les autres langages de programmation comme Java ou PHP.
class Rectangle { constructor(hauteur, largeur) { this.hauteur = hauteur; this.largeur = largeur; } }
Le mot clé this dans une fonction
function test() { console.log('this in a function', this); } const test2 = () => { console.log('this in arrow function', this); } test2() // objet window test() // objet Window
Comme on est dnas l’espace global (Window) le mot clé this représente Window. En effet les deux fonction sont définie dans l’espace de nom global et non dans un objet.
Le mot clé this dans l’espace de nom global
dans une fonction, la valeur de this dépend de comment la fonction est appelée. Considérez this comme un paramètres caché de la fonction. this est l’objet dans lequel la fonction est appelée.
Le cas des fonctions flèches
function test() { console.log('this in a function', this); } const test2 = () => { console.log('this in arrow function', this); } // test2() // undefined // test() // objet Window const obj1 = { name: "obj1" }; const obj2 = { name: "obj2" }; obj1.test = test obj2.test2 = test2 console.log(obj1.test()) // this est l'objet obj1 console.log('arrow ', obj2.test2()) // this est l'objet Window
Dans les fonctions flèche, le this
représente toujours l’objet global Window, alors que dans les fonctions classiques this
représente l’objet dans lequel la fonction est définie.
Le cas du strict-mode
"use strict"; function show() { console.log(this); } show(); // undefined
This dans un event listener
Ici c’est plus courant, vous avez déjà vu avec Jquery le $this, en Javascript pur c’est pareil avec this
<span id="btn">Click Me</span> <script> const btn = document.querySelector("#btn") btn.addEventListener('click',function(event){ console.log(this) } </script>
Modifier la valeur de this avec bind,call et apply
const person1 = { name: 'Paul', surname: 'Auchan', sayName: function () { return this.name + " " + this.surname; } } const person2 = { name: 'Justin', surname: 'News' } console.log(person1.sayName.call(person2)); // le this sera le this de person2 //appel avec arguments const person2 = { name: 'Justin', surname: 'News' } const person3 = { name: 'Paul', surname: 'Auchan', sayName: function (ville) { return this.name + " " + this.surname + ', ' + ville; } } console.log(person3.sayName.call(person2, "Paris")); // le this sera le this de person2
Cas de bind
Autant call et apply se ressemblent, bind n’exécute pas la fonction , il faut l’invoquer manuellement. bind ne fait que binder une variable
//bind const person4 = { name: 'Jules', surname: 'Sanchez', sayName: function() { return this.name + " " + this.surname } } const person5 = { name: 'Rudy', surname: 'Hess' } const sayPerson2Name = person1.sayName.bind(person2) console.log(sayPerson2Name())