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?
      
  • Arrow функциялар: Өзүнүн 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