Czym jest kontekst w funkcji?
sobes.tech AI
Odpowiedź od AI
Kontekst (this) w funkcji JavaScript jest określany przez sposób wywołania funkcji, a nie przez miejsce jej deklaracji. Wskazuje on na obiekt, do którego funkcja należy lub który ją wywołuje.
Sposoby określenia kontekstu:
-
Kontekst globalny: Poza funkcjami lub jeśli funkcja jest wywoływana bez jawnego obiektu (
thisbędzie równe obiektowi globalnemuwindoww przeglądarce,globalw Node.js, lubundefinedw trybie strict).// W przeglądarce console.log(this === window); // true function showContext() { console.log(this); } showContext(); // window -
Kontekst obiektu (metoda): Jeśli funkcja jest wywoływana jako metoda obiektu (
obj.method()),thiswewnątrz funkcji będzie odnosić się do tego obiektu.const user = { name: 'Alice', greet: function() { console.log(`Cześć, nazywam się ${this.name}`); } }; user.greet(); // Cześć, nazywam się Alice -
Kontekst konstruktora: Przy wywołaniu funkcji słowem kluczowym
new(new MyClass()), tworzony jest nowy obiekt, athisw konstruktorze odnosi się do tego nowego obiektu.function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob -
Wyraźne ustawienie kontekstu: Metody
call,applyibindpozwalają jawnie ustawić wartośćthispodczas wywołania funkcji.call(thisArg, arg1, arg2, ...): Wywołuje funkcję zthisustawionym nathisArgi argumentami przekazanymi pojedynczo.apply(thisArg, [argsArray]): Wywołuje funkcję zthisustawionym nathisArgi argumentami w formie tablicy.bind(thisArg, arg1, arg2, ...): Zwraca nową funkcję, w którejthisjest ustalony na podaną wartość.
function displayInfo(age) { console.log(`${this.name} ma ${age} lat.`); } const person = { name: 'Charlie' }; displayInfo.call(person, 30); // Charlie ma 30 lat. displayInfo.apply(person, [35]); // Charlie ma 35 lat. const bondedDisplayInfo = displayInfo.bind(person, 40); bondedDisplayInfo(); // Charlie ma 40 lat. -
Funkcje strzałkowe: Funkcje strzałkowe nie mają własnego
this. Dziedzicząthisz otoczenia leksykalnego, w którym zostały zdefiniowane.const anotherUser = { name: 'David', sayHello: function() { const innerArrow = () => { console.log(`Cześć z arrow, ${this.name}`); }; innerArrow(); // `this` tutaj to anotherUser, odziedziczone po sayHello }, sayHelloBad: () => { // zła praktyka dla metod obiektów console.log(`Cześć z arrow, ${this.name}`); } }; anotherUser.sayHello(); // Cześć z arrow, David // W przeglądarce, poza trybem strict anotherUser.sayHelloBad(); // Cześć z arrow, undefined (`this` - window)
Zrozumienie kontekstu jest kluczowe dla poprawnej pracy z obiektami, metodami i obsługą zdarzeń w JavaScript.