Middle
Czym różnią się funkcje strzałkowe od zwykłych funkcji pod względem konieczności użycia metody bind?
sobes.tech AI
Odpowiedź od AI
Funkcje strzałkowe nie mają własnego kontekstu this. Przechwytują this z otaczającego środowiska (środowiska leksykalnego).
Zwykłe funkcje definiują swoje this w zależności od tego, jak są wywoływane:
- W kontekście globalnym (
windowlubglobal). - Jako metoda obiektu (
thiswskazuje na obiekt). - Jako konstruktor (
thiswskazuje na nową instancję). - Używając
call,applylubbind(thisjest ustawiane jawnie).
Ponieważ funkcje strzałkowe nie mają własnego this, wywołanie bind na funkcji strzałkowej nie ma sensu i nie zmieni leksykalnie powiązanego this. Próbując wywołać bind na funkcji strzałkowej, zostanie ona po prostu zwrócona.
Przykład:
// Funkcja zwykła
const normalFunc = function() {
console.log(this.name);
};
const obj1 = { name: 'Obiekt 1', method: normalFunc };
const obj2 = { name: 'Obiekt 2' };
obj1.method(); // Wyjście: Obiekt 1
const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Wyjście: Obiekt 2 (this został pomyślnie zmieniony)
// Funkcja strzałkowa
const arrowFunc = () => {
console.log(this.name);
};
const obj3 = { name: 'Obiekt 3' };
// ArrowFunc przechwytuje `this` z otaczającego kontekstu (w tym przypadku, obiekt globalny)
arrowFunc(); // Wyjście: undefined (prawdopodobnie, ponieważ `this` nie zawiera `name`)
const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Wyjście: undefined (this pozostało bez zmian, bind nie zadziałał)
// Przykład z przechwytem `this`
const person = {
name: 'Ala',
greet: function() {
// Tutaj `this` wskazuje na `person`
const greetLater = () => {
// Tutaj `this` jest przechwytywane z zewnętrznej funkcji `greet`, czyli również wskazuje na `person`
console.log(`Cześć, ${this.name}!`);
};
greetLater();
}
};
person.greet(); // Wyjście: Cześć, Ala!
Podsumowując, metoda bind jest potrzebna dla zwykłych funkcji, aby jawnie ustawić ich kontekst this, podczas gdy dla funkcji strzałkowych jest to zbędne, ponieważ ich this jest określane leksykalnie i nie może być zmienione za pomocą bind.