Sobes.tech
Middle

Kuidas erinevad noolefunktsioonid tavalistest funktsioonidest seoses bind meetodi kasutamise vajadusega?

sobes.tech AI

Vastus AI-lt

Nooltfunktsioonidel puudub oma this kontekst. Nad haaravad this ümbruskonnast (leksikalisest keskkonnast).

Tavalised funktsioonid määravad oma this sõltuvalt sellest, kuidas neid kutsutakse:

  • Globaalses kontekstis (window või global).
  • Objekti meetodina (this viitab objekti).
  • Konstruktorina (this viitab uuele eksemplarile).
  • Kasutades call, apply või bind (this on selgelt määratletud).

Kuna noolfunktsioonidel puudub oma this, bind-i kasutamine noolfunktsiooni puhul ei oma mõtet ning ei muuda leksikaalselt seotud this-i. Kui proovite kutsuda bind noolfunktsiooni peale, tagastab see lihtsalt iseenda:

Näide:

// Tavaline funktsioon
const normalFunc = function() {
  console.log(this.name);
};

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

obj1.method(); // Tulemus: Object 1

const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Tulemus: Object 2 (`this` on edukalt muudetud)

// Noolfunktsioon
const arrowFunc = () => {
  console.log(this.name);
};

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

// ArrowFunc haarab `this` ümbruskonnast (antud juhul globaalne objekt)
arrowFunc(); // Tulemuseks: undefined (võimalik, sest `this` ei sisalda `name`)

const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Tulemuseks: undefined (`this` jäi samaks, bind ei mõjutanud)

// Näide `this` haaramisega
const person = {
  name: 'Alice',
  greet: function() {
    // Siin `this` viitab `person`-ile
    const greetLater = () => {
      // Siin `this` haaratakse välisest `greet`-ist, st. samuti viitab `person`-ile
      console.log(`Hello, ${this.name}!`);
    };
    greetLater();
  }
};

person.greet(); // Tulemuseks: Hello, Alice!

Lõpuks, bind meetod on vajalik tavaliste funktsioonide jaoks, et selgelt määrata nende kontekst this, samas kui noolfunktsioonide puhul on see üleliigne, kuna nende this on leksikaliselt määratud ja seda ei saa bind-iga muuta.