Sobes.tech
Junior

JavaScriptda funktsiya kontekstini qanday o'zgartirish mumkin?

sobes.tech AI

AIdan javob

JavaScriptda, funksiyaning bajarilish konteksti (this) bir necha usul bilan o'zgartirilishi mumkin:

  1. call(): Funksiyani belgilangan this qiymati va vergul bilan ajratilgan argumentlar bilan bajaradi.

    // function.call(thisArg, arg1, arg2, ...)
    function greet(name) {
      console.log(`Salom, ${name}! Men ${this.type}`);
    }
    
    const obj = { type: 'obyekt' };
    
    greet.call(obj, 'Alisa'); // Salom, Alisa! Men obyekt
    
  2. apply(): Funksiyani belgilangan this qiymati va argumentlar ro'yxati yoki array-like ob'ekti sifatida o'tkaziladi.

    // function.apply(thisArg, [argsArray])
    function sum(a, b) {
      console.log(`${this.name}: ${a + b}`);
    }
    
    const context = { name: 'Hisoblagich' };
    const numbers = [5, 10];
    
    sum.apply(context, numbers); // Hisoblagich: 15
    
  3. bind(): Belgilangan this qiymatiga "bog'langan" yangi funksiyani yaratadi. Asl funksiyani darhol chaqirmaydi.

    // function.bind(thisArg, arg1, arg2, ...)
    const user = { name: 'Bob' };
    
    function sayHello() {
      console.log(`Mening ismim ${this.name}`);
    }
    
    const boundSayHello = sayHello.bind(user);
    
    boundSayHello(); // Mening ismim Bob
    
  4. O'q funksiyalari (=>): O'q funksiyalari o'zining this kontekstiga ega emas. Ular this ni leksikal muhitdan (ular ta'riflangan yuqori scope) oladi.

    class MyClass {
      constructor() {
        this.value = 'sinf qiymati';
        // O'q funksiyasi sinf kontekstini saqlaydi
        this.logValue = () => {
          console.log(this.value);
        };
      }
    }
    
    const instance = new MyClass();
    const method = instance.logValue;
    
    method(); // sinf qiymati (kontekst saqlanadi)
    
    // Bind qilmasdan oddiy funksiya bilan solishtiring
    class BoshqaSinf {
        constructor() {
            this.value = 'boshqa qiymat';
            this.logValue = function() {
                console.log(this.value); // 'this' window yoki strict rejimda undefined bo'ladi
            };
        }
    }
    
    const boshqaInstance = new BoshqaSinf();
    const boshqaMethod = boshqaInstance.logValue;
    
    boshqaMethod(); // undefined (kontekst funktsiya sifatida chaqirilganda yo'qoladi)