Sobes.tech
Middle

խոսեք JavaScript-ում ֆունկցիաների կոնտեքստի մասին։

sobes.tech AI

Պատասխան AI-ից

JavaScript- ում գործառույթի կատարման կոնտեքստը (this) որոշում է, թե ինչպես է գործառույթը կանչվում և ինչ արժեքներ հասանելի են նրա ներսում: Կոնտեքստը դինամիկորեն փոխվում է կանչման եղանակից կախված:

  • Գլոբալ կոնտեքստ: Ֆունկցիաներից դուրս, this հղվում է գլոբալ օբյեկտին (window բրաուզերում, global Node.js-ում):
    // Բրաուզերում
    console.log(this === window); // true
    
    // Node.js-ում
    console.log(this === global); // true
    
  • Ֆունկցիայի կոնտեքստ:
    • Ստանդարտ կանչում: Անստրիկ ռեժիմում this հղվում է գլոբալ օբյեկտին (եթե ֆունկցիան չի օբյեկտի մեթոդ): Ստրիկ ռեժիմում ("use strict";) this կլինի undefined:
      function showThis() {
        console.log(this);
      }
      
      showThis(); // Անստրիկ ռեժիմում՝ Գլոբալ օբյեկտ; Ստրիկ ռեժիմում՝ `undefined`
      
    • Որոշման որպես օբյեկտի մեթոդ:
      • this հղվում է օբյեկտին, որի մաս է կազմում մեթոդը:
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Hello, my name is " + this.name);
        }
      };
      
      user.greet(); // Hello, my name is Alice
      
    • Համար new-ով (կոնստրուկտոր):
      • Ստեղծում է նոր օբյեկտ, որը դառնում է this-ի արժեքը կոնստրուկտոր ֆունկցիայում, և վերադարձնում այդ օբյեկտը:
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Հստակ կոնտեքստի նշում (call, apply, bind):
      • call(thisArg, arg1, arg2, ...): Կատարում է ֆունկցիան նշված this-ով և առանձին նշված արգումենտներով:
      • apply(thisArg, [argsArray]): Կատարում է ֆունկցիան նշված this-ով և արգումենտներով զանգվածով:
      • bind(thisArg, arg1, arg2, ...): Վերադարձնում է նոր ֆունկցիա, որի this-ը հավերժորեն կապված է thisArg-ի հետ և արգումենտների:
      function introduce(greeting, punctuation) {
        console.log(greeting + ", I am " + this.name + punctuation);
      }
      
      const person = { name: 'Charlie' };
      
      introduce.call(person, "Hi", "!");  // Hi, I am Charlie!
      introduce.apply(person, ["Hello", "."]); // Hello, I am Charlie.
      
      const boundIntroduce = introduce.bind(person, "Hey");
      boundIntroduce("?"); // Hey, I am Charlie?
      
  • Արո ֆունկցիաներ: Չունեն սեփական this, այն ժառանգում են շրջակա լեքսիկային միջավայրից, որտեղ դրանք սահմանվել են:
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` այստեղ հղվում է `obj`
        setTimeout(() => {
          // `this` այստեղ նույնպես հղվում է `obj` (ժառանգված `sayLater`-ից)
          console.log("Later, I am " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Later, I am David