Sobes.tech
Junior

Co se zobrazí v konzoli, pokud použijete this v console.log?

sobes.tech AI

Odpověď od AI

Závisí na kontextu volání console.log a režimu přísnosti JavaScriptu ("use strict").

V globálním kontextu (mimo funkce a moduly):

  • V ne-strikt režimu ("use strict" chybí nebo je deklarován ve funkci): this odkazuje na globální objekt (window v prohlížeči, global v Node.js).
  • V přísném režimu: this bude undefined.

Uvnitř funkce:

  • V ne-strikt režimu: this odkazuje na globální objekt, pokud je funkce volána jako běžná funkce (myFunction()). Pokud je funkce volána jako metoda objektu (myObject.myMethod()), this odkazuje na tento objekt (myObject). Pokud je funkce použita jako konstruktor (new MyClass()), this odkazuje na novou instanci objektu.
  • V přísném režimu: this bude undefined, pokud je funkce volána jako běžná funkce. V ostatních případech (metoda objektu, konstruktor) je chování stejné jako v ne-strikt režimu.

Uvnitř šipkové funkce (=>):

  • this je lexikálně děděno z okolního kontextu. To znamená, že hodnota this uvnitř šipkové funkce bude stejná jako v externí běžné funkci nebo v globálním kontextu, kde byla deklarována, bez ohledu na to, jak je volána. Šipkové funkce nezachycují this ve svém vlastním kontextu volání.

Příklad:

// Globální kontext
console.log(this); // V prohlížeči: Window, v Node.js: global (nepřísný režim)
                    // V prohlížeči: undefined, v Node.js: undefined (přísný režim)

// Běžná funkce
function showThisNonStrict() {
  console.log(this);
}

showThisNonStrict(); // V prohlížeč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

// Šipková funkce
const arrowFunc = () => {
  console.log(this);
};

arrowFunc(); // V prohlížeči: Window, v Node.js: global (dědí z globálního kontextu)

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

myObjectWithArrow.arrowMethod(); // V prohlížeči: Window, v Node.js: global (dědí z deklarace kontextu)