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

Undefined no método

Olá,

No exercício não consegui entender por que no código:

  imprime(nomes) {

                nomes.forEach(function(nome) {
                    console.log(this);
                    console.log(`${this._codigo}: ${nome}`);
                });
            }

O this._codigo é undefined poderiam me explicar?

3 respostas

Pois esse é comportamento normal do javascript. Veja a sintaxe da função forEach:

arr.forEach(callback[, thisArg])

Conforme explicado na documentação, o valor passado para o argumento thisArg será o valor utilizado em this dentro da função. Caso nenhum valor seja passado, this ficará undefined.

Ou seja, se você trocar de

nomes.forEach(function(nome) {
     console.log(this);
         console.log(`${this._codigo}: ${nome}`);
 });

para

nomes.forEach(function(nome) {
    console.log(this);
    console.log(`${this._codigo}: ${nome}`);
 }, this);

a função irá funcionar corretamente.

Porque foi usado function e não arrow function. Função tem escopo dinâmico e arrow function não, estático. Se o this é dinâmico e muda com a função, o this da função não possui a propriedade _codigo.

solução!

Para ficar ainda melhor, pense assim. Com uma arrow function você sabe qual é o this só olhando seu código. No caso do exemplo, o this será a classe que possui o método imprime. Como arrow function tem escopo léxico (estático) essa previsibilidade é possível.

Quando você usou função, toda função possui o this que faria no contexto no qual foi chamado. Qual o contexto dela no código? O forEach, então o this será pode ser o array de nomes e não sua classe.

Esse exercício foi criado justamente para o aluno entender as diferenças entre um e outro. Tem mais exercícios, inclusive aqueles que mostram quando arrow function não é indicado.