Sobes.tech
Middle

Функсияҳои ишоракунанда дар чӣ фарқ мекунанд аз функсияҳои оддӣ дар бораи зарурати истифодаи усули bind?

sobes.tech AI

Ҷавоб аз AI

Функсияҳои стрелка ҳеҷ контексти this-и худро надоранд. Онҳо this-ро аз муҳити атроф ( муҳити лексикалӣ) мегиранд.

Функсияҳои оддӣ this-ро вобаста ба усули даъваташон муайян мекунанд:

  • Дар контексти глобалӣ (window ё global).
  • ҳамчун методи объект (this ба объект ишора мекунад).
  • ҳамчун конструктор (this ба намунаи нав ишора мекунад).
  • Бо истифода аз call, apply ё bind (this ба таври ошкор муайян карда мешавад).

Аз сабаби он ки функсияҳои стрелка this-и худро надоранд, даъвати bind ба функсияи стрелка маъно надорад ва this-и лексикалӣ, ки бо bind пайваст шудааст, тағйир намеёбад. Агар кӯшиш кунед, ки bind-ро ба функсияи стрелка даъват кунед, он танҳо худи онро бармегардонад.

Масалан:

// Функсияи оддӣ
const normalFunc = function() {
  console.log(this.name);
};

const obj1 = { name: 'Объект 1', method: normalFunc };
const obj2 = { name: 'Объект 2' };

obj1.method(); // Натиҷа: Объект 1

const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Натиҷа: Объект 2 (this бо муваффақият тағйир ёфт)

// Функсияи стрелка
const arrowFunc = () => {
  console.log(this.name);
};

const obj3 = { name: 'Объект 3' };

// ArrowFunc `this`-ро аз муҳити атроф мегирад (дар ин ҳолат, объект глобалӣ)
arrowFunc(); // Натиҷа: undefined (шояд, зеро `this` дорои `name` нест)

const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Натиҷа: undefined (`this` тағйир наёфтааст, bind таъсир нарасонд)

// Масалан бо пайваст кардани `this`
const person = {
  name: 'Алиса',
  greet: function() {
    // Ин ҷо, `this` ба `person` ишора мекунад
    const greetLater = () => {
      // Ин ҷо, `this` аз муҳити берунаи `greet` гирифта мешавад, яъне ҳам `person`
      console.log(`Салом, ${this.name}!`);
    };
    greetLater();
  }
};

person.greet(); // Натиҷа: Салом, Алиса!

Хулоса, усули bind барои функсияҳои оддӣ зарур аст, то контексти this-ро равшан муайян кунад, дар ҳоле ки барои функсияҳои стрелка, он зарур нест, зеро this-и онҳо лексикалӣ муайян мешавад ва бо bind тағйир намеёбад.