Sobes.tech
Middle

Yoyilgan funksiyalar oddiy funksiyalardan bind metodidan foydalanish zaruriyati bo'yicha qanday farq qiladi?

sobes.tech AI

AIdan javob

Ok işarəli funksiyalar öz this kontekstinə malik deyil. Onlar ətraf mühitdən (lexikal mühit) this-i ələ keçirirlər.

Adi funksiyalar çağırılma üsulundan asılı olaraq öz this-lərini müəyyən edir:

  • Qlobal kontekstdə (window və ya global).
  • Obeyektin metodu kimi (this obyektə işarə edir).
  • Konstruktor kimi (this yeni nümunəyə işarə edir).
  • call, apply və ya bind istifadə etməklə (this açıq şəkildə təyin edilir).

Çünki ok funksiyalar öz this-inə malik deyil, bind-in ok funksiyasında çağırılması məntiqsizdir və leksikal olaraq bağlı this-i dəyişməz. Ok funksiyasında bind çağırmağa cəhd etsəniz, o sadəcə özünü geri qaytaracaq.

Misal:

// Adi funksiya
const normalFunc = function() {
  console.log(this.name);
};

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

obj1.method(); // Çıxış: Obyekt 1

const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Çıxış: Obyekt 2 (this uğurla dəyişdirildi)

// Ok funksiyası
const arrowFunc = () => {
  console.log(this.name);
};

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

// ArrowFunc ətraf mühitdən `this`-i ələ keçirir (bu halda, qlobal obyekt)
arrowFunc(); // Çıxış: undefined (yəqin ki, `this` `name`-i içermir)

const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Çıxış: undefined (`this` dəyişməyib, bind təsir etməyib)

// `this`-in ələ keçirilməsi nümunəsi
const person = {
  name: 'Alicə',
  greet: function() {
    // Burada, `this` `person`-a işarə edir
    const greetLater = () => {
      // Burada, `this` `greet`-dən xarici kontekstdən ələ keçirilir, yəni də `person`
      console.log(`Salam, ${this.name}!`);
    };
    greetLater();
  }
};

person.greet(); // Çıxış: Salam, Alicə!

Nəticədə, bind adi funksiyalar üçün onların kontekstini this-i açıq şəkildə təyin etmək üçün lazımdır, ok funksiyalar üçün isə artıqdır, çünki onların this leksikal olaraq müəyyən edilir və bind ilə dəyişdirilə bilməz.