Sobes.tech
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 (window ili global).
  • Kao metoda objekta (this ukazuje na objekat).
  • Kao konstruktor (this ukazuje na novi primerak).
  • Korišćenjem call, apply ili bind (this se 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.