Sobes.tech
Junior

JavaScript-də funksiyanın kontekstini necə dəyişdirmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də, funksiyanın icra konteksti (this) bir neçə üsulla dəyişdirilə bilər:

  1. call(): Bir funksiyanı müəyyən edilmiş this dəyəri və vergüllə ayrılmış arqumentlərlə icra edir.

    // function.call(thisArg, arg1, arg2, ...)
    function greet(name) {
      console.log(`Salam, ${name}! Mən ${this.type}`);
    }
    
    const obj = { type: 'obyekt' };
    
    greet.call(obj, 'Alyona'); // Salam, Alyona! Mən obyekt
    
  2. apply(): Bir funksiyanı müəyyən edilmiş this dəyəri və arqumentləri array və ya array-ə bənzər obyekt kimi ötürməklə icra edir.

    // function.apply(thisArg, [argsArray])
    function sum(a, b) {
      console.log(`${this.name}: ${a + b}`);
    }
    
    const context = { name: 'Hesablama maşını' };
    const numbers = [5, 10];
    
    sum.apply(context, numbers); // Hesablama maşını: 15
    
  3. bind(): Müəyyən edilmiş this dəyərinə "bağlanmış" yeni funksiya yaradır. Orijinal funksiya dərhal icra edilmir.

    // function.bind(thisArg, arg1, arg2, ...)
    const user = { name: 'Bob' };
    
    function sayHello() {
      console.log(`Mənim adım ${this.name}`);
    }
    
    const boundSayHello = sayHello.bind(user);
    
    boundSayHello(); // Mənim adım Bob
    
  4. Ox funksiyaları (=>): Ox funksiyaları öz this kontekstinə malik deyil. Onlar this-ni leksikal mühitdən (tərif olunduğu yuxarı scope-dan) tuturlar.

    class MyClass {
      constructor() {
        this.value = 'sinif dəyəri';
        // Ox funksiyası sinif kontekstini saxlayır
        this.logValue = () => {
          console.log(this.value);
        };
      }
    }
    
    const instance = new MyClass();
    const method = instance.logValue;
    
    method(); // sinif dəyəri (kontekst saxlanılır)
    
    // Bind olmadan normal funksiyaya qarşılaşdırın
    class DigərSinif {
        constructor() {
            this.value = 'başqa dəyər';
            this.logValue = function() {
                console.log(this.value); // 'this' window və ya strict rejimdə undefined olacaq
            };
        }
    }
    
    const digerInstance = new DigərSinif();
    const digerMetod = digerInstance.logValue;
    
    digerMetod(); // undefined (kontekst itirilir, funksiyadan çağırıldıqda)