Middle
Čime se streličaste funkcije razlikuju od običnih funkcija u pogledu potrebe za korišćenjem metode bind?
sobes.tech АИ
Одговор од АИ
Funkcije sa strelicom nemaju sopstveni kontekst this. One hvataju this iz okruženja (leksikalno okruženje).
Obične funkcije definišu svoj this u zavisnosti od načina na koji su pozvane:
- U globalnom kontekstu (
windowiliglobal). - Kao metoda objekta (
thisukazuje na objekat). - Kao konstruktor (
thisukazuje na novi primerak). - Korišćenjem
call,applyilibind(thisse eksplicitno postavlja).
Pošto funkcije sa strelicom nemaju svoj this, pozivanje bind na strelicu nema smisla i neće promeniti leksikalno vezani this. Ako pokušate da pozovete bind na funkciji sa strelicom, ona će jednostavno biti vraćena sama sebi.
Primer:
// Obična funkcija
const normalFunc = function() {
console.log(this.name);
};
const obj1 = { name: 'Objekat 1', metoda: normalFunc };
const obj2 = { name: 'Objekat 2' };
obj1.metoda(); // Izlaz: Objekat 1
const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Izlaz: Objekat 2 (this je uspešno promenjen)
// Funkcija sa strelicom
const arrowFunc = () => {
console.log(this.name);
};
const obj3 = { name: 'Objekat 3' };
// ArrowFunc hvata `this` iz okruženja (u ovom slučaju, globalni objekat)
arrowFunc(); // Izlaz: undefined (verovatno, jer `this` ne sadrži `name`)
const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Izlaz: undefined (`this` nije promenjen, bind nije imao efekta)
// Primer sa hvatanjem `this`
const person = {
name: 'Alisa',
greet: function() {
// Ovde, `this` pokazuje na `person`
const greetLater = () => {
// Ovde, `this` se hvata iz spoljnog konteksta `greet`, dakle, takođe, na `person`
console.log(`Zdravo, ${this.name}!`);
};
greetLater();
}
};
person.greet(); // Izlaz: Zdravo, Alisa!
Ukratko, metoda bind je potrebna za obične funkcije da bi eksplicitno postavila njihov kontekst this, dok je za funkcije sa strelicom suvišna, jer je njihov this određen leksikalno i ne može se promeniti pomoću bind.