Sobes.tech
Middle

Odkiaľ pochádza kontext funkcie v JavaScripte?

sobes.tech AI

Odpoveď od AI

Kontext vykonávania (this) v JavaScripte sa určuje v momente volania funkcie, nie v momente jej deklarácie. Nasledujúce faktory ovplyvňujú jeho hodnotu:

  • Globálny kontext: Mimo funkcií sa this odkazuje na globálny objekt (v prehliadači window, v Node.js global). V režime prísnosti ('use strict') bude this v tomto prípade undefined.

    // V prehliadači
    console.log(this); // window
    
    // V Node.js
    console.log(this); // global
    
  • Volanie metódy objektu: Ak je funkcia volaná ako metóda objektu (cez bodku), this sa odkazuje na tento objekt.

    const obj = {
      name: 'Obj',
      method: function() {
        console.log(this.name);
      }
    };
    obj.method(); // Obj
    
  • "Obyčajné" volanie funkcie: Pri jednoduchom volaní funkcie (nie ako metóda), this v ne-strict režime sa odkazuje na globálny objekt. V prísnom režime bude this undefined.

    function greet() {
      console.log(this);
    }
    greet(); // window (v ne-strict režime) alebo undefined (v prísnom režime)
    
  • Konstruktér (new): Keď je funkcia volaná s kľúčovým slovom new, funguje ako konštruktor. this vo vnútri funkcie sa odkazuje na nový, práve vytvorený objekt.

    function Person(name) {
      this.name = name;
    }
    const person1 = new Person('Alice');
    console.log(person1.name); // Alice
    
  • Metódy call, apply, bind: Tieto metódy jasne umožňujú nastaviť hodnotu this pre funkciu.

    • call a apply volajú funkciu ihneď, prenášajúc this ako prvý argument. call prijíma ostatné argumenty jednotlivé, apply ako pole.
    • bind vracia novú funkciu, v ktorej je hodnota this navždy "viazaná" na odovzdaný prvý argument.
    const anotherObj = { name: 'Another Obj' };
    
    function displayContext() {
      console.log(this.name);
    }
    
    displayContext.call(anotherObj); // Another Obj
    displayContext.apply(anotherObj); // Another Obj
    
    const boundFunction = displayContext.bind(anotherObj);
    boundFunction(); // Another Obj
    
  • Šípové funkcie: Šípové funkcie nemajú vlastný this. "Zachytávajú" hodnotu this z lexikálneho prostredia, v ktorom boli deklarované. To ich robí užitočnými pre callbacky vo vnútri metód alebo pri práci s DOM udalosťami.

    const objWithArrow = {
      name: 'Arrow Obj',
      method() {
        const arrowFunc = () => {
          console.log(this.name); // `this` sa berie z `method` (objWithArrow)
        };
        arrowFunc();
      }
    };
    objWithArrow.method(); // Arrow Obj
    
    // Porovnajte s obyčajnou funkciou
    const objWithRegular = {
      name: 'Regular Obj',
      method() {
        const regularFunc = function() {
          console.log(this); // `this` bude window alebo undefined (v závislosti od prísneho režimu) pri volaní v takomto kontexte
        };
        regularFunc();
      }
    };
    objWithRegular.method(); // window (alebo undefined)
    

Definícia kontextu — jedna z kľúčových vlastností JavaScriptu, a pochopenie týchto pravidiel je zásadné pre správnu prácu s funkciami a objektmi.