Sobes.tech
Middle

Ox işarəsi funksiyaları ilə adi funksiyalar arasındakı fərq bind metodundan istifadə etmə ehtiyacıdır?

sobes.tech Süni İntellekt

AI-dan cavab

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.