Sobes.tech
Junior

Šta će se prikazati u konzoli ako koristite this u console.log?

sobes.tech АИ

Одговор од АИ

Zavisno od konteksta poziva console.log i strogog režima JavaScript ("use strict").

U globalnom kontekstu (izvan funkcija i modula):

  • U nestriktivnom režimu ("use strict" nije prisutan ili je deklarisan unutar funkcije): this će se odnositi na globalni objekat (window u pretraživaču, global u Node.js-u).
  • U strogom režimu: this će biti undefined.

Unutar funkcije:

  • U nestriktivnom režimu: this će se odnositi na globalni objekat ako je funkcija pozvana kao obična funkcija (myFunction()). Ako je funkcija pozvana kao metod objekta (myObject.myMethod()), this će se odnositi na objekat (myObject). Ako se funkcija koristi kao konstruktor (new MyClass()), this će se odnositi na novi primerak objekta.
  • U strogom režimu: this će biti undefined ako je funkcija pozvana kao obična funkcija. U ostalim slučajevima (metod objekta, konstruktor) ponašanje je isto kao u nestriktivnom režimu.

Unutar streličaste funkcije (=>):

  • this se leksički nasleđuje iz okoline. To znači da će vrednost this unutar streličaste funkcije biti ista kao i u spoljašnjoj običnoj funkciji ili u globalnom kontekstu gde je streličasta funkcija deklarisana, nezavisno od načina poziva. Streličaste funkcije ne vežu this za svoj sopstveni kontekst poziva.

Primer:

// Globalni kontekst
console.log(this); // U pretraživaču: Window, u Node.js: global (nestriktivni režim)
                    // U pretraživaču: undefined, u Node.js: undefined (strog režim)

// Obična funkcija
function showThisNonStrict() {
  console.log(this);
}

showThisNonStrict(); // U pretraživaču: Window, u 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

// Streličasta funkcija
const arrowFunc = () => {
  console.log(this);
};

arrowFunc(); // U pretraživaču: Window, u Node.js: global (nasleđuje iz globalnog konteksta)

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

myObjectWithArrow.arrowMethod(); // U pretraživaču: Window, u Node.js: global (nasleđuje iz konteksta deklaracije)