Od czego zależy wartość kontekstu wykonania `this` w JavaScript?
sobes.tech AI
Odpowiedź od AI
Wartość this w JavaScript zależy od sposobu wywołania funkcji. Główne scenariusze:
-
Kontekst globalny: Poza funkcjami, w trybie ścisłym (
'use strict')thisjestundefined. Bez trybu ścisłego, jest to obiekt globalny (windoww przeglądarce,globalw Node.js). -
Wywołanie metody obiektu:
thiswskazuje na obiekt, do którego należy wywoływana metoda.const obj = { prop: 'wartość', method: function() { // this === obj console.log(this.prop); } }; obj.method(); -
Normalne wywołanie funkcji: W trybie ścisłym
thisjestundefined. Bez trybu ścisłego, jest to obiekt globalny.function myFunction() { // w trybie ścisłym this === undefined // bez trybu ścisłego this === window (w przeglądarce) console.log(this); } myFunction(); -
Konstruktor (
new): Przy użyciu operatoranewz funkcją konstruktora,thiswewnątrz funkcji odnosi się do nowo tworzonego obiektu.function MyClass(name) { this.name = name; // this === nowy obiekt } const instance = new MyClass('test'); // instance.name === 'test' -
Wyraźne powiązanie (
call,apply,bind): Metodycall,applyibindpozwalają jawnie ustawić wartośćthisdla funkcji.call(thisArg, arg1, arg2, ...): Wywołuje funkcję, ustawiającthisnathisArgi przekazując argumenty pojedynczo.apply(thisArg, [argsArray]): Wywołuje funkcję, ustawiającthisnathisArgi przekazując argumenty jako tablicę.bind(thisArg): Zwraca nową funkcję z na stałe powiązanymthis.
const anotherObj = { value: 42 }; function showValue() { console.log(this.value); } showValue.call(anotherObj); // Wypisze 42 -
Funkcje strzałkowe (
=>): Funkcje strzałkowe nie mają własnegothis. Wartośćthiswewnątrz funkcji strzałkowej dziedziczy z leksykalnego kontekstu, w którym została zdefiniowana.const outerObj = { name: 'Outer', method: function() { const arrowFunc = () => { // this dziedziczy z method, wywoływanej jako metoda outerObj console.log(this.name); }; arrowFunc(); } }; outerObj.method(); // Wypisze 'Outer' const anotherArrowFunc = () => { // this dziedziczy z kontekstu globalnego (lub undefined w trybie ścisłym) console.log(this); }; anotherArrowFunc(); -
Obsługa zdarzeń DOM: W większości przypadków,
thisw obsłudze zdarzenia odnosi się do elementu DOM, na którym wystąpiło zdarzenie.// Przykład w przeglądarce const button = document.querySelector('button'); button.addEventListener('click', function() { // this === button console.log(this.tagName); });
Zrozumienie tych mechanizmów jest kluczowe dla poprawnego użycia this w JavaScript.