Sobes.tech
Middle

გააზიარე JavaScript-ის ფუნქციების კონტექსტი.

sobes.tech AI

პასუხი AI-სგან

JavaScript-те функциянын аткаруу контексти (this) аныктайт, ал функцияны кандайча чакырганды жана анын ичинде кандай маанилер жеткиликтүү экенин аныктайт. Контекст динамикалык түрдө чакырылыштын ыкмасына жараша өзгөрөт:

  • Глобалдык контекст: Функциялардан тышкары, this глобалдык обьекке шилтеме кылат (window браузерде, global Node.jsте).
    // Браузерде
    console.log(this === window); // true
    
    // Node.jsте
    console.log(this === global); // true
    
  • Функциянын контексти:
    • Стандарттык чакыруу: Не-строг режимде this глобалдык обьекке шилтеме кылат (эгер функция обьекттин методу эмес болсо). Строг режимде ("use strict";) this undefined болот:
      function showThis() {
        console.log(this);
      }
      
      showThis(); // Не-строг режимде: Глобалдык обьек; Строг режимде: `undefined`
      
    • Обьекттин методу катары чакыруу:
      • this обьектке шилтеме кылат, анын ичинде методдун бөлүгү:
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Hello, my name is " + this.name);
        }
      };
      
      user.greet(); // Hello, my name is Alice
      
    • new менен чакыруу (конструктор):
      • Жаңы обьект түзөт, ал this мааниси болот жана ошол обьект кайтарылат:
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Ачык контекст көрсөтүү (call, apply, bind):
      • call(thisArg, arg1, arg2, ...): Функцияны белгилүү this менен жана жеке аргументтер менен чакырат:
      • apply(thisArg, [argsArray]): Функцияны белгилүү this менен жана массив түрүндөгү аргументтер менен чакырат:
      • bind(thisArg, arg1, arg2, ...): Жаңы функцияны кайтарат, анын this ылдамдык менен thisArgке байланган жана аргументтер:
      function introduce(greeting, punctuation) {
        console.log(greeting + ", I am " + this.name + punctuation);
      }
      
      const person = { name: 'Charlie' };
      
      introduce.call(person, "Hi", "!");  // Hi, I am Charlie!
      introduce.apply(person, ["Hello", "."]); // Hello, I am Charlie.
      
      const boundIntroduce = introduce.bind(person, "Hey");
      boundIntroduce("?"); // Hey, I am Charlie?
      
  • Стрелочные функции: Өзүнүн this мааниси жок. Алар аны сырттагы лексикалык чөйрөдөн алат:
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` бул жерде `obj`ке шилтеме кылат
        setTimeout(() => {
          // `this` бул жерде дагы `obj`ке шилтеме кылат (жасалган `sayLater`тен)
          console.log("Later, I am " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Later, I am David