Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida na Arrow Function

Considere o código 1 sendo o objeto abaixo:

const cliente = {
    nome:"Marcos",
    idade:32,
    email:"marcos@dominio.com",
    telefone:["8500000000","9900000000"],
    saldo:150,
    efetuaPagamento:  function (valor) {
        if (valor > this.saldo){
            console.log(`Saldo insuficiente. Saldo atual ${this.saldo}.`);
        } else {
            this.saldo -= valor;
            console.log(`Pagamento realizado com sucesso. Saldo atual: ${this.saldo}.`);
        }
    }
}

Agora, considere o código 2 sendo a classe abaixo:

class ModuloDeImpressao {
    codigo = 20;
    
    imprime(nomes) {
        nomes.forEach(function (nome){
        console.log(`${this.codigo}: ${nome}`);
     });
   }
}

Por qual motivo, no Código 1, o this, mesmo dentro de uma function, consegue acessar o valor da propriedade 'saldo' no valor de 150 e, no Código 2, o mesmo this não consegue acessar a propriedade 'codigo' no valor de 20 ???

Teoricamente a function cria um novo escopo e no Código 2 o problema seria resolvido com uma Arrow Function. Por que no Código 1 um novo escopo não foi criado com a function?

Ficam duas questões aí para quem puder ajudar no entendimento...

3 respostas

Oi, Thiago, tudo bem?

No primeiro código, você tem um objeto cliente com um método efetuaPagamento. Quando você chama cliente.efetuaPagamento(valor), o this dentro da função efetuaPagamento se refere ao objeto cliente. Isso acontece porque a função é chamada como um método do objeto, então o contexto (this) é o próprio objeto cliente.

No segundo código, o problema ocorre porque a função passada para o método forEach cria um novo escopo de this. Dentro dessa função, o this não se refere mais à instância da classe ModuloDeImpressao, mas sim ao contexto global (ou undefined no modo estrito).

As Arrow Functions não têm seu próprio this; elas herdam o this do escopo em que foram definidas. Portanto, se você usar uma Arrow Function dentro do forEach, o this continuará se referindo à instância da classe ModuloDeImpressao.

Espero ter ajudado. Caso tenha dúvidas, conte com o fórum. Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Boa tarde, Rodrigo.

O que não ficou claro no meu entendimento é o motivo da function, no código 2, criar um novo escopo, mas não no código 1.

Afinal efetuaPagamento() e imprime() são métodos, qual a diferença entre eles no uso da function ?

solução!

Busquei mais informações em outros posts aqui mesmo na Alura e encontrei o post do Murilo Ramos Parra (https://cursos.alura.com.br/forum/topico-escopo-foreach-128053) que trata exatamente deste assunto.

Na questão da function o que interessa, de fato, é o contexto que invoca a função contexto.function(). O valor do this se refere ao contexto que fez a invocação da function.

Logo, no código 1 o this se refere ao objeto 'cliente' e, no código 2, o this se refere ao array 'nomes' que faz a chamada ao loop forEach que invoca, por sua vez, a function.

Acredito que seja esse o entendimento.