Sobes.tech
Middle

JavaScript-də funksiyaların konteksti haqqında danış.

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də funksiyanın (this) icra konteksti funksiyanın necə çağrıldığını və onun içində hansı dəyərlərin mövcud olduğunu müəyyən edir. Kontekst dinamik olaraq çağırış üsulundan asılı olaraq dəyişir:

  • Qlobal kontekst: Funksiyaların xaricində, this qlobal obyektə istinad edir (window brauzerdə, global Node.js-də).
    // Brauzerdə
    console.log(this === window); // true
    
    // Node.js-də
    console.log(this === global); // true
    
  • Funksiya konteksti:
    • Standart çağırış: Non-strict rejimdə, funksiyanın içində this qlobal obyektə istinad edir (əgər funksiya obyektin metodu deyilsə). Strict rejimdə ("use strict";) this undefined olacaq.
      function showThis() {
        console.log(this);
      }
      
      showThis(); // Non-strict rejimdə: Qlobal obyekt; Strict rejimdə: undefined
      
    • Obyektin metodu kimi çağırış: this metodu aid olan obyektə istinad edir.
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Salam, mənim adım " + this.name);
        }
      };
      
      user.greet(); // Salam, mənim adım Alice
      
    • new ilə çağırış (konstruktor): Yeni obyekt yaradır, bu obyekt this dəyəri olur və həmin obyekti qaytarır.
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Açıq kontekst göstəricisi (call, apply, bind):
      • call(thisArg, arg1, arg2, ...): Funksiyanı göstərilən this və argumentlərlə çağırır.
      • apply(thisArg, [argsArray]): Funksiyanı göstərilən this və argumentlər massivində çağırır.
      • bind(thisArg, arg1, arg2, ...): Yeni funksiya qaytarır, onun this-i daimi olaraq thisArg-a bağlanır və argumentlər əvvəlcədən bağlanır.
      function introduce(greeting, punctuation) {
        console.log(greeting + ", mən " + this.name + punctuation);
      }
      
      const person = { name: 'Charlie' };
      
      introduce.call(person, "Salam", "!");  // Salam, mən Charlie!
      introduce.apply(person, ["Salam", "."]); // Salam, mən Charlie.
      
      const boundIntroduce = introduce.bind(person, "Hə");
      boundIntroduce("?"); // Hə, mən Charlie?
      
  • Ox funksiyalar: Öz this kontekstinə malik deyil. Onlar this-i onları təyin edən leksikal kontekstdən tuturlar.
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` burada `obj`-ə istinad edir
        setTimeout(() => {
          // `this` burada da `obj`-ə istinad edir (sayLater`dən miras alınmış)
          console.log("Sonra, mən " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Sonra, mən David