Junior
Jak zmienić kontekst funkcji w JavaScript?
sobes.tech AI
Odpowiedź od AI
W JavaScript, kontekst wykonania funkcji (this) można zmienić na kilka sposobów:
-
call(): Uruchamia funkcję z określoną wartościąthisi argumentami przekazanymi oddzielnie przecinkami.// function.call(thisArg, arg1, arg2, ...) function greet(name) { console.log(`Cześć, ${name}! Jestem ${this.type}`); } const obj = { type: 'obiekt' }; greet.call(obj, 'Alicja'); // Cześć, Alicja! Jestem obiekt -
apply(): Uruchamia funkcję z określoną wartościąthisi argumentami przekazanymi jako tablica lub obiekt podobny do tablicy.// function.apply(thisArg, [argsArray]) function sum(a, b) { console.log(`${this.name}: ${a + b}`); } const context = { name: 'Kalkulator' }; const numbers = [5, 10]; sum.apply(context, numbers); // Kalkulator: 15 -
bind(): Tworzy nową funkcję "związaną" z określoną wartościąthis. Oryginalna funkcja nie jest wywoływana od razu.// function.bind(thisArg, arg1, arg2, ...) const user = { name: 'Bob' }; function sayHello() { console.log(`Nazywam się ${this.name}`); } const boundSayHello = sayHello.bind(user); boundSayHello(); // Nazywam się Bob -
Funkcje strzałkowe (
=>): Funkcje strzałkowe nie mają własnego kontekstuthis. przechwytująthisz otaczającego środowiska (z zakresu leksykalnego, w którym zostały zdefiniowane).class MyClass { constructor() { this.value = 'wartość klasy'; // Funkcja strzałkowa zachowuje kontekst klasy this.logValue = () => { console.log(this.value); }; } } const instance = new MyClass(); const method = instance.logValue; method(); // wartość klasy (kontekst jest zachowany) // Porównanie z normalną funkcją bez bind class InnaKlasa { constructor() { this.value = 'inna wartość'; this.logValue = function() { console.log(this.value); // 'this' będzie window lub undefined w trybie strict }; } } const innaInstancja = new InnaKlasa(); const innaMetoda = innaInstancja.logValue; innaMetoda(); // undefined (kontekst zostaje utracony przy wywołaniu jako oddzielna funkcja)