Sobes.tech
Middle

JavaScriptdagi funksiyalar konteksti haqida gapir.

sobes.tech AI

AIdan javob

JavaScriptda funksiyaning (this) bajarilish konteksti funksiyani qanday chaqirilgani va uning ichida qanday qiymatlar mavjudligini belgilaydi. Kontekst chaqirilish usuliga qarab dinamik ravishda o'zgaradi:

  • Global kontekst: Funktsiyalar tashqarisida, this global obyekti anglatadi (window brauzerda, global Node.jsda).
    // Brauzerda
    console.log(this === window); // true
    
    // Node.jsda
    console.log(this === global); // true
    
  • Funktsiya konteksti:
    • Standart chaqiriq: Non-strict rejimda, funksiyada this global obyekti anglatadi (agar funksiya ob'ekt metodi bo'lmasa). Strict rejimda ("use strict";) this undefined bo'ladi.
      function showThis() {
        console.log(this);
      }
      
      showThis(); // Non-strict rejimda: Global ob'ekt; Strict rejimda: undefined
      
    • Ob'ekt metodi sifatida chaqirish: this metodga tegishli ob'ektni anglatadi.
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Salom, mening ismim " + this.name);
        }
      };
      
      user.greet(); // Salom, mening ismim Alice
      
    • new bilan chaqirish (konstruktor): Yangi ob'ekt yaratadi, bu ob'ekt this qiymati bo'lib, va bu ob'ektni qaytaradi.
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Aniq kontekst ko'rsatish (call, apply, bind):
      • call(thisArg, arg1, arg2, ...): Funksiyani belgilangan this va argumentlar bilan chaqiradi.
      • apply(thisArg, [argsArray]): Funksiyani belgilangan this va argumentlar bilan chaqiradi, argumentlar massiv shaklida.
      • bind(thisArg, arg1, arg2, ...): Yangi funksiya qaytaradi, uning this doimiy ravishda thisArgga bog'langan va argumentlar oldindan bog'langan.
      function introduce(greeting, punctuation) {
        console.log(greeting + ", men " + this.name + punctuation);
      }
      
      const person = { name: 'Charlie' };
      
      introduce.call(person, "Salom", "!");  // Salom, men Charlie!
      introduce.apply(person, ["Hello", "."]); // Hello, men Charlie.
      
      const boundIntroduce = introduce.bind(person, "Hey");
      boundIntroduce("?"); // Hey, men Charlie?
      
  • Arrow funksiyalar: O'zining this kontekstiga ega emas. Ular thisni ularni aniqlagan leksikal kontekstdan oladi.
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` bu yerda `obj`ga ishora qiladi
        setTimeout(() => {
          // `this` bu yerda ham `obj`ga ishora qiladi (sayLaterdan meros olgan)
          console.log("Keyin, men " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Keyin, men David