Sobes.tech
Junior

Čo sa zobrazí v konzole, ak použijete this v console.log?

sobes.tech AI

Odpoveď od AI

Závisí od kontextu volania console.log a prísneho režimu JavaScript ("use strict").

V globálnom kontexte (mimo funkcií a modulov):

  • V nestriktívnom režime ("use strict" nie je prítomný alebo je deklarovaný vo funkcii): this bude odkazovať na globálny objekt (window v prehliadači, global v Node.js).
  • V prísnom režime: this bude undefined.

Vo vnútri funkcie:

  • V nestriktívnom režime: this bude odkazovať na globálny objekt, ak je funkcia volaná ako bežná funkcia (myFunction()). Ak je funkcia volaná ako metóda objektu (myObject.myMethod()), this bude odkazovať na objekt (myObject). Ak je funkcia použitá ako konštruktor (new MyClass()), this bude odkazovať na nový inštanciu objektu.
  • V prísnom režime: this bude undefined, ak je funkcia volaná ako bežná funkcia. V ostatných prípadoch (metóda objektu, konštruktor) je správanie rovnaké ako v nestriktívnom režime.

Vo vnútri šípovej funkcie (=>):

  • this sa leksične dedí z okolia. To znamená, že hodnota this vo vnútri šípovej funkcie bude rovnaká ako v vonkajšej bežnej funkcii alebo v globálnom kontexte, kde bola šípková funkcia deklarovaná, nezávisle od spôsobu jej volania. Šípové funkcie nezviažu this so svojím vlastným kontextom volania.

Príklad:

// Globálny kontext
console.log(this); // V prehliadači: Window, v Node.js: global (nestriktívny režim)
                    // V prehliadači: undefined, v Node.js: undefined (prísny režim)

// Bežná funkcia
function showThisNonStrict() {
  console.log(this);
}

showThisNonStrict(); // V prehliadači: Window, v 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

// Šípová funkcia
const arrowFunc = () => {
  console.log(this);
};

arrowFunc(); // V prehliadači: Window, v Node.js: global (zdedí z globálneho kontextu)

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

myObjectWithArrow.arrowMethod(); // V prehliadači: Window, v Node.js: global (zdedí z kontextu deklarácie)