Sobes.tech
Junior

O que será exibido no console se usar this no console.log?

sobes.tech IA

Resposta da IA

Depende do contexto da chamada a console.log e do modo estrito do JavaScript ("use strict").

No contexto global (fora de funções e módulos):

  • Em modo não estrito ("use strict" ausente ou declarado numa função): this referirá ao objeto global (window no navegador, global no Node.js).
  • Em modo estrito: this será undefined.

Dentro de uma função:

  • Em modo não estrito: this referirá ao objeto global se a função for chamada como uma função normal (myFunction()). Se a função for chamada como método de um objeto (myObject.myMethod()), this referirá ao objeto (myObject). Se a função for usada como construtor (new MyClass()), this referirá à nova instância do objeto.
  • Em modo estrito: this será undefined se a função for chamada como uma função normal. Em outros casos (método de objeto, construtor), o comportamento é o mesmo que em modo não estrito.

Dentro de uma função seta (=>):

  • this é herdado lexicalmente do contexto circundante. Isso significa que o valor de this dentro de uma função seta será igual ao da função normal externa ou do contexto global onde foi declarada, independentemente de como seja chamada. Funções seta não vinculam this ao seu próprio contexto de chamada.

Exemplo:

// Contexto global
console.log(this); // No navegador: Window, no Node.js: global (modo não estrito)
                    // No navegador: undefined, no Node.js: undefined (modo estrito)

// Função normal
function showThisNonStrict() {
  console.log(this);
}

showThisNonStrict(); // No navegador: Window, no 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

// Função seta
const arrowFunc = () => {
  console.log(this);
};

arrowFunc(); // No navegador: Window, no Node.js: global (herda do contexto global)

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

myObjectWithArrow.arrowMethod(); // No navegador: Window, no Node.js: global (herda do contexto de declaração)