Sobes.tech
Junior

Ի՞նչ կցուցադրվի կոնսոլում, եթե օգտագործեք this-ը console.log-ում:

sobes.tech AI

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

Կոնտեքստից կախված է console.log կանչի և JavaScript-ի խստության ռեժիմի ("use strict"

Գլոբալ կոնտեքստում (ֆունկցիաներից և մոդուլներից դուրս).

  • Ներքին ռեժիմում ("use strict" բացակայում է կամ հայտարարված է ֆունկցիայի մեջ). this-ը կվերաբերի գլոբալ օբյեկտին (window բրաուզերում, global Node.js-ում):
  • Խստիվ ռեժիմում. this-ը կլինի undefined։

Ֆունկցիայի ներսում:

  • Ներքին ռեժիմում. this-ը կվերաբերի գլոբալ օբյեկտին, եթե ֆունկցիան կանչվի որպես սովորական ֆունկցիա (myFunction()). Եթե ֆունկցիան կանչվի որպես օբյեկտի մեթոդ (myObject.myMethod()), this-ը կվերաբերի օբյեկտին (myObject). Եթե ֆունկցիան օգտագործվի որպես կոնստրուկտոր (new MyClass()), this-ը կվերաբերի նոր օբյեկտի օրինակին։
  • Խստիվ ռեժիմում. this-ը կլինի undefined, եթե ֆունկցիան կանչվի որպես սովորական ֆունկցիա։ Մյուս դեպքերում (օբյեկտի մեթոդ, կոնստրուկտոր) վարքագիծը նույնն է, ինչ նեղ ռեժիմում։

Ստրելային ֆունկցիայի ներսում (=>):

  • this-ը լեքսիկապես ժառանգվում է շրջապատից։ Դա նշանակում է, որ this-ի արժեքը ստրելային ֆունկցիայում կլինի նույնը, ինչ արտաքին սովորական ֆունկցիայում կամ գլոբալ կոնտեքստում, որտեղ հայտարարվել է ստրելային ֆունկցիան, անկախ նրանից, թե ինչպես է այն կանչվել։ Ստրելային ֆունկցիաները չեն կապում this-ը իրենց սեփական կանչի կոնտեքստին։

Օրինակ՝

// Գլոբալ կոնտեքստ
console.log(this); // Բրաուզերում՝ Window, Node.js-ում՝ global (նեղ ռեժիմ)
                    // Բրաուզերում՝ undefined, Node.js-ում՝ undefined (խստիվ ռեժիմ)

// Սովորական ֆունկցիա
function showThisNonStrict() {
  console.log(this);
}

showThisNonStrict(); // Բրաուզերում՝ Window, Node.js-ում՝ global

function showThisStrict() {
  "use strict";
  console.log(this);
}

showThisStrict(); // undefined

const myObject = {
  methodNonStrict: function() {
    console.log(this);
  },
  methodStrict: function() {
    "use strict";
    console.log(this);
  }
};

myObject.methodNonStrict(); // myObject
myObject.methodStrict();   // myObject

// Ստրելային ֆունկցիա
const arrowFunc = () => {
  console.log(this);
};

arrowFunc(); // Բրաուզերում՝ Window, Node.js-ում՝ global (ժառանգում է շրջապատից)

const myObjectWithArrow = {
  arrowMethod: () => {
    console.log(this);
  }
};

myObjectWithArrow.arrowMethod(); // Բրաուզերում՝ Window, Node.js-ում՝ global (ժառանգում է հայտարարության կոնտեքստից)