Sobes.tech
Middle

A `this` végrehajtási kontextus értéke mitől függ JavaScriptben?

sobes.tech MI

Válasz az MI-től

A this értéke JavaScriptben függ a függvény hívási módjától. Fő forgatókönyvek:

  1. Globális kontextus: Függvényen kívül, szigorú módban ('use strict') this undefined. Szabvány módban pedig a globális objektum (window böngészőben, global` Node.js-ben).

  2. Objektum metódusának hívása: this az objektumra mutat, amelyhez a hívott metódus tartozik.

    const obj = {
      prop: 'érték',
      method: function() {
        // this === obj
        console.log(this.prop);
      }
    };
    obj.method();
    
  3. Egyszerű függvényhívás: Szigorú módban this undefined. Szabvány módban a globális objektum.

    function myFunction() {
      // szigorú módban this === undefined
      // szabvány módban this === window (böngészőben)
      console.log(this);
    }
    myFunction();
    
  4. Konstruktor (new): A new operátorral hívott függvényben this az újonnan létrehozott objektumra mutat.

    function MyClass(name) {
      this.name = name; // this === új objektum
    }
    const instance = new MyClass('teszt');
    // instance.name === 'teszt'
    
  5. Kifejezett kötés (call, apply, bind): Ezek a módszerek lehetővé teszik this értékének explicit beállítását.

    • call(thisArg, arg1, arg2, ...): meghívja a függvényt, this értékét thisArg-ra állítva, és argumentumokat külön-külön adva át.
    • apply(thisArg, [argsArray]): meghívja a függvényt, this értékét thisArg-ra állítva, és argumentumokat tömbként adva át.
    • bind(thisArg): egy új függvényt ad vissza, amelyhez rögzített this érték tartozik.
    const anotherObj = { value: 42 };
    function showValue() {
      console.log(this.value);
    }
    showValue.call(anotherObj); // Kiírja 42
    
  6. Nyílfüggvények (=>): A nyílfüggvények saját this-el nem rendelkeznek. A this értéke öröklődik a lexikális környezetből, ahol definiálták.

    const outerObj = {
      name: 'Külső',
      method: function() {
        const arrowFunc = () => {
          // itt a `this` az outerObj `method`-jától öröklődik
          console.log(this.name);
        };
        arrowFunc();
      }
    };
    outerObj.method(); // Kiírja 'Külső'
    
    const anotherArrowFunc = () => {
        // itt a `this` a globális környezetből öröklődik (vagy undefined szigorú módban)
        console.log(this);
    };
    anotherArrowFunc();
    
  7. Eseménykezelők DOM-ban: A legtöbb esetben a this az eseménykezelőben az elemre mutat, ahol az esemény történt.

    // Böngészőben példa
    const button = document.querySelector('button');
    button.addEventListener('click', function() {
      // this === button
      console.log(this.tagName);
    });
    

Ezeknek a mechanizmusoknak a megértése kritikus a this helyes használatához JavaScriptben.