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-ით।