Sobes.tech
Middle

Jak zakázat změnu kontextu v JavaScriptu?

sobes.tech AI

Odpověď od AI

V JavaScriptu je kontext vykonávání funkce (hodnota this) určován dynamicky v okamžiku volání. Není možné jeho změnu zcela zabránit v absolutním smyslu, ale lze ji kontrolovat nebo fixovat různými způsoby:

  1. Metody call, apply, bind:

    • call a apply umožňují volat funkci s výslovně uvedeným kontextem a argumenty (call s oddělenými, apply s polem).
    • bind vytváří novou svázanou funkci, ve které je this pevně fixováno při jejím vytvoření, bez ohledu na pozdější volání. To je nejúčinnější způsob, jak "zakázat" změnu kontextu pro budoucí volání.
    // Příklad s bind
    const obj = { value: 42 };
    function showValue() {
      console.log(this.value);
    }
    
    const boundShowValue = showValue.bind(obj);
    
    boundShowValue(); // Vypíše 42
    boundShowValue.call({ value: 100 }); // Stále vypíše 42, kontext je fixován
    
  2. Šipkové funkce (Arrow Functions):

    • Šipkové funkce nemají vlastní this. zachycují this z okolního (lexikálního) prostředí v době jejich definice.
    • Kontext šipkové funkce nelze změnit pomocí call, apply nebo bind.
    // Příklad se šipkovou funkcí
    const outerObj = { name: 'Outer' };
    
    class MyClass {
      constructor() {
        this.className = 'MyClass';
        this.showNameArrow = () => {
          // `this` zde zachycuje `this` z konstruktoru nebo definice
          console.log(this.className);
        };
      }
    
      showNameRegular() {
        // `this` zde je určeno při volání
        console.log(this.className);
      }
    }
    
    const instance = new MyClass();
    instance.showNameArrow(); // Vypíše 'MyClass'
    
    const anotherObj = { className: 'Another' };
    const boundArrow = instance.showNameArrow.bind(anotherObj); // Pokus o změnu kontextu
    boundArrow(); // Stále vypíše 'MyClass', kontext šipkové funkce je neměnný
    
    instance.showNameRegular.call(anotherObj); // Vypíše 'Another', kontext normální funkce se mění
    

Stručně řečeno, "zakázat změnu kontextu" je lépe chápat jako pevné ukotvení kontextu. K tomu se používá bind u běžných funkcí a přirozené lexikální vázání u šipkových funkcí. Šipkové funkce jsou v tomto ohledu "nepřekonatelné".