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(); // Արդյունք՝ 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-ով։