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 аркылуу өзгөртүлбөйт.