Sobes.tech
Middle

Fale sobre o contexto das funções em JavaScript.

sobes.tech IA

Resposta da IA

O contexto de execução de uma função (this) em JavaScript determina como a função é chamada e quais valores estão disponíveis dentro dela. O contexto muda dinamicamente dependendo da forma como a função é chamada:

  • Contexto global: Fora de funções, this refere-se ao objeto global (window no navegador, global no Node.js).
    // No navegador
    console.log(this === window); // true
    
    // No Node.js
    console.log(this === global); // true
    
  • Contexto de função:
    • Chamada padrão: Em modo não estrito, this dentro de uma função refere-se ao objeto global (se a função não for um método de um objeto). Em modo estrito ("use strict";), this será undefined.
      function showThis() {
        console.log(this);
      }
      
      showThis(); // Em modo não estrito: Objeto global; Em modo estrito: undefined
      
    • Chamada como método de um objeto: this refere-se ao objeto ao qual o método pertence.
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Olá, meu nome é " + this.name);
        }
      };
      
      user.greet(); // Olá, meu nome é Alice
      
    • Com new (construtor): Cria um novo objeto, que se torna o valor de this dentro da função construtora, e retorna esse objeto.
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Indicação explícita do contexto (call, apply, bind):
      • call(thisArg, arg1, arg2, ...) : Chama a função com o this especificado e os argumentos listados individualmente.
      • apply(thisArg, [argsArray]) : Chama a função com o this especificado e os argumentos em forma de array.
      • bind(thisArg, arg1, arg2, ...) : Retorna uma nova função com this ligado permanentemente a thisArg e com os argumentos ligados.
      function introduce(greeting, punctuation) {
        console.log(greeting + ", eu sou " + this.name + punctuation);
      }
      
      const person = { name: 'Charlie' };
      
      introduce.call(person, "Oi", "!");  // Oi, eu sou Charlie!
      introduce.apply(person, ["Olá", "."]); // Olá, eu sou Charlie.
      
      const boundIntroduce = introduce.bind(person, "Ei");
      boundIntroduce("?"); // Ei, eu sou Charlie?
      
  • Funções arrow: Não têm seu próprio contexto this. Elas capturam this do escopo léxico em que foram definidas.
    const obj = {
      name: 'David',
      sayLater: function() {
        // `this` aqui refere-se a `obj`
        setTimeout(() => {
          // `this` aqui também refere-se a `obj` (herdado de `sayLater`)
          console.log("Mais tarde, eu sou " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Mais tarde, eu sou David