Sobes.tech
Middle

Тирөө функциялары жана жөнөкөй функциялар арасындагы айырма — bind ыкмасын колдонуу зарылдыгы боюнча кандай?

sobes.tech AI

AIден жооп

Нуткалык функциялар өзүнүн this контекстине ээ эмес. Алар this-ти айланасынан (лексикалык чөйрөдөн) алат.

Жалпы функциялар алардын this-ти кандайча чакырылганына жараша аныкталат:

  • Глобалдык контекстте (window же global).
  • Объекттин методу катары (this объектти көрсөтөт).
  • Конструктор катары (this жаңы экземплярга көрсөтөт).
  • call, apply же bind колдонуу менен (this так аныкталат).

Нуткалык функциялар өзүнүн this-и жок болгондуктан, bind чакырыгы маанисиз жана лексикалык байланышкан this-ти өзгөртпөйт. Нуткалык функцияга bind колдонсоңуз, ал жөн гана өзү кайтарат:

Мисал:

// Жалпы функция
const normalFunc = function() {
  console.log(this.name);
};

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

obj1.method(); // Натыйжа: Object 1

const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Натыйжа: Object 2 (`this` ийгиликтүү өзгөрдү)

// Нуткалык функция
const arrowFunc = () => {
  console.log(this.name);
};

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

// ArrowFunc сырттагы контексттен `this`-ти алат (бул учурда, глобалдык объект)
arrowFunc(); // Натыйжа: белгисиз (мүмкүн, `this` name камтыбайт)

const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Натыйжа: белгисиз (`this` калат өзгөрбөйт, bind иштебейт)

// `this`-ти алуу мисалы
const person = {
  name: 'Alice',
  greet: function() {
    // Бул жерде `this` `person`-га көрсөтөт
    const greetLater = () => {
      // Бул жерде `this` сырттагы `greet` функциясынан алынып, дагы `person`-га көрсөтөт
      console.log(`Hello, ${this.name}!`);
    };
    greetLater();
  }
};

person.greet(); // Натыйжа: Hello, Alice!

Жыйынтыктап айтканда, bind ыкмасы жалпы функциялар үчүн керек, алардын контекстин this аныктоо үчүн, ал эми нуткалык функциялар үчүн ал артыкчылык болуп саналат, анткени алардын this лексикалык түрдө аныкталган жана bind аркылуу өзгөртүлбөйт.