Sobes.tech
Middle

Kā atšķiras bultiņas funkcijas no parastajām funkcijām attiecībā uz nepieciešamību izmantot bind metodi?

sobes.tech AI

Atbilde no AI

Šaušanas funkcijas nav sava this konteksta. Tās aizķer this no apkārtējās vides (leksikālā apkārtne).

Parastās funkcijas nosaka savu this atkarībā no tā, kā tās ir izsauktas:

  • Globālā kontekstā (window vai global).
  • Kā objekta metode (this norāda uz objektu).
  • Kā konstruktoru (this norāda uz jaunu eksemplāru).
  • Izmantojot call, apply vai bind (this ir skaidri noteikts).

Tā kā šaušanas funkcijas nav sava this, bind izsaukums uz šaušanas funkcijas nav jēdzīgs un nemainīs leksikāli saistīto this. Mēģinot izsaukt bind uz šaušanas funkcijas, tā vienkārši tiks atgriezta pati:

Piemērs:

// Parasta funkcija
const normalFunc = function() {
  console.log(this.name);
};

const obj1 = { name: 'Object 1', method: normalFunc };
const obj2 = { name: 'Object 2' };

obj1.method(); // Rezultāts: Object 1

const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Rezultāts: Object 2 (`this` veiksmīgi mainīts)

// Šaušanas funkcija
const arrowFunc = () => {
  console.log(this.name);
};

const obj3 = { name: 'Object 3' };

// ArrowFunc ņem `this` no apkārtējās konteksta (šajā gadījumā, globālais objekts)
arrowFunc(); // Rezultāts: undefined (iespējams, jo `this` nesatur `name`)

const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Rezultāts: undefined (`this` paliek tas pats, bind neietekmēja)

// Piemērs ar `this` noķeršanu
const person = {
  name: 'Alice',
  greet: function() {
    // Šeit `this` norāda uz `person`
    const greetLater = () => {
      // Šeit `this` tiek noķerts no ārējās `greet` funkcijas, t.i., arī norāda uz `person`
      console.log(`Hello, ${this.name}!`);
    };
    greetLater();
  }
};

person.greet(); // Rezultāts: Hello, Alice!

Galu galā, bind metode ir nepieciešama parastām funkcijām, lai skaidri noteiktu to kontekstu this, kamēr šaušanas funkcijām tas ir lieks, jo to this ir leksiski noteikts un nevar tikt mainīts ar bind.