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:
-
Metody
call,apply,bind:callaapplyumožňují volat funkci s výslovně uvedeným kontextem a argumenty (calls oddělenými,applys polem).bindvytváří novou svázanou funkci, ve které jethispevně 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 -
Šipkové funkce (Arrow Functions):
- Šipkové funkce nemají vlastní
this. zachycujíthisz okolního (lexikálního) prostředí v době jejich definice. - Kontext šipkové funkce nelze změnit pomocí
call,applynebobind.
// 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í - Šipkové funkce nemají vlastní
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é".