Sobes.tech
Middle

De quoi dépend la valeur du contexte d'exécution de `this` en JavaScript?

sobes.tech IA

Réponse de l'IA

La valeur de this en JavaScript dépend de la façon dont la fonction est appelée. Les scénarios principaux:

  1. Contexte global: Hors des fonctions en mode strict ('use strict'), this est undefined. Sans mode strict, c'est l'objet global (window dans le navigateur, global dans Node.js).

  2. Appel d'une méthode d'un objet: this pointe vers l'objet auquel appartient la méthode appelée.

    const obj = {
      prop: 'valeur',
      method: function() {
        // this === obj
        console.log(this.prop);
      }
    };
    obj.method();
    
  3. Appel normal d'une fonction: En mode strict, this est undefined. Sans mode strict, c'est l'objet global.

    function myFunction() {
      // en mode strict this === undefined
      // sans mode strict this === window (dans le navigateur)
      console.log(this);
    }
    myFunction();
    
  4. Constructeur (new): En utilisant l'opérateur new avec une fonction constructeur, this dans la fonction fait référence au nouvel objet créé.

    function MyClass(name) {
      this.name = name; // this === nouvel objet
    }
    const instance = new MyClass('test');
    // instance.name === 'test'
    
  5. Liaison explicite (call, apply, bind): Les méthodes call, apply et bind permettent de définir explicitement la valeur de this pour une fonction.

    • call(thisArg, arg1, arg2, ...): Appelle la fonction en définissant this sur thisArg et en passant les arguments séparément.
    • apply(thisArg, [argsArray]): Appelle la fonction en définissant this sur thisArg et en passant les arguments sous forme de tableau.
    • bind(thisArg): Retourne une nouvelle fonction avec this lié de façon permanente.
    const anotherObj = { value: 42 };
    function showValue() {
      console.log(this.value);
    }
    showValue.call(anotherObj); // Affiche 42
    
  6. Fonctions fléchées (=>): Les fonctions fléchées n'ont pas leur propre this. La valeur de this à l'intérieur d'une fonction fléchée hérite du contexte lexical dans lequel elle a été définie.

    const outerObj = {
      name: 'Outer',
      method: function() {
        const arrowFunc = () => {
          // this hérite de method, qui est appelé comme méthode de outerObj
          console.log(this.name);
        };
        arrowFunc();
      }
    };
    outerObj.method(); // Affiche 'Outer'
    
    const anotherArrowFunc = () => {
        // this hérite du contexte global (ou undefined en mode strict)
        console.log(this);
    };
    anotherArrowFunc();
    
  7. Gestionnaires d'événements DOM: Dans la plupart des cas, this dans un gestionnaire d'événement fait référence à l'élément DOM sur lequel l'événement s'est produit.

    // Exemple dans le navigateur
    const button = document.querySelector('button');
    button.addEventListener('click', function() {
      // this === button
      console.log(this.tagName);
    });
    

Comprendre ces mécanismes est crucial pour utiliser correctement this en JavaScript.