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(); // Արդյունք՝ undefined (մոտավոր, քանի որ `this`-ը չի պարունակում `name`)
const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Արդյունք՝ undefined (`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-ով։