Sobes.tech
Middle

Маъзулоти функсия дар JavaScript аз куҷо меояд?

sobes.tech AI

Ҷавоб аз AI

Маҳз дар лаҳзаи даъвати функсия, наҳзати иҷрои (ё this) дар JavaScript муайян мешавад, на дар лаҳзаи эълон. Ин омилҳо ба арзиши он таъсир мерасонанд:

  • Маҳз дар контексти умумӣ: Дар хориҷ аз функсияҳо, this ба объектии глобалӣ ишора мекунад (дар браузер window, дар Node.js global). Дар режими қатъӣ ('use strict') this дар ин ҳолат undefined хоҳад буд.

    // Дар браузер
    console.log(this); // window
    
    // Дар Node.js
    console.log(this); // global
    
  • Завқи методи объект: Агар функсия ҳамчун методи объект (бо истифода аз нуқта) даъват шавад, this ба он объект ишора мекунад.

    const obj = {
      name: 'Obj',
      method: function() {
        console.log(this.name);
      }
    };
    obj.method(); // Obj
    
  • Завқи оддӣ (функсияи оддӣ): Дар даъвати одии функсия (на ҳамчун метод), this дар режими ғайри қатъӣ ба объектии глобалӣ ишора мекунад. Дар режими қатъӣ, this undefined хоҳад буд.

    function greet() {
      console.log(this);
    }
    greet(); // window (дар режими ғайри қатъӣ) ё undefined (дар режими қатъӣ)
    
  • Конструктор (new): Вақте ки функсия бо калимаи калидии new даъват мешавад, он ҳамчун конструктор амал мекунад. this дар дохили функсия ба объекти нав, ки ҳоло сохта шудааст, ишора мекунад.

    function Person(name) {
      this.name = name;
    }
    const person1 = new Person('Alice');
    console.log(person1.name); // Alice
    
  • Методҳои call, apply, bind: Ин методҳо ба таври равшан имкон медиҳанд, ки арзиши this-ро барои функсия муайян кунед.

    • call ва apply функсияро фавран даъват мекунанд, бо this ҳамчун аргументи аввал. call боқимондаи аргументҳоро ба таври ҷудогона мегирад, apply – ҳамчун массив.
    • bind функсияи навро бармегардонад, ки арзиши this дар он ҳамеша ба аргументи аввал баста шудааст.
    const anotherObj = { name: 'Another Obj' };
    
    function displayContext() {
      console.log(this.name);
    }
    
    displayContext.call(anotherObj); // Another Obj
    displayContext.apply(anotherObj); // Another Obj
    
    const boundFunction = displayContext.bind(anotherObj);
    boundFunction(); // Another Obj
    
  • Функсияҳои стрелка: Функсияҳои стрелка this-и худро надоранд. Онҳо арзиши this-ро аз муҳити лексикалӣ, ки дар он эълон шудаанд, мегиранд. Ин онҳоро барои callback-ҳо дар дохили методҳо ё ҳангоми кор бо ҳодисаҳои DOM муфид месозад.

    const objWithArrow = {
      name: 'Arrow Obj',
      method() {
        const arrowFunc = () => {
          console.log(this.name); // `this` аз `method` (objWithArrow) гирифта мешавад
        };
        arrowFunc();
      }
    };
    objWithArrow.method(); // Arrow Obj
    
    // Бо функсияи оддӣ муқоиса кунед
    const objWithRegular = {
      name: 'Regular Obj',
      method() {
        const regularFunc = function() {
          console.log(this); // `this` хоҳад буд window ё undefined (ба вобаста аз режим) дар вақти даъват
        };
        regularFunc();
      }
    };
    objWithRegular.method(); // window (ё undefined)
    

Таъйини контекст — яке аз хусусиятҳои калидии JavaScript, ва фаҳмидани ин қоидаҳо барои кор бо функсияҳо ва объектҳо муҳим аст.