3
respostas

Não estou com uma dúvida e sim venho a esclarecer que não tive problema acerca de referência.

O "this" dentro da função anônima, em meu código que é idêntico ao do professor, não faz referência à classe cujo nome é "ListaNegociacoes" e sim à "NegociacoesController". Dessa forma, eu não recebi uma mensagem de erro.

3 respostas

Corrigindo : eu utilizei uma Arrow Function e não uma "função literal" : Function(){}; Utilizando uma função literal eu tive o mesmo erro que o professor exibiu em aula.

Oi Eugenio!

Desculpe a demora pelo retorno. Essa situação que você encontrou geralmente causa muita confusão.

this._listaNegociacoes = new ListaNegociacoes(function (model) {
    this._negociacoesView.update(model);
});

Neste exemplo, o primeiro this se refere ao NegociacoesController e o segundo ao ListaNegociacoes, isso porque o this depende do contexto em que está sendo declarado.

Porém as arrow functions não possuem seu próprio this e elas pegam o this do escopo em que foram declaradas, neste caso o do NegociacoesController.

this._listaNegociacoes = new ListaNegociacoes( (model) =>  {
    this._negociacoesView.update(model);
});

No exemplo acima os dois this se referem ao NegociacoesController. O primeiro porque está se referindo diretamente ao NegociacoesController e o segundo porque o this na declaração da função é o NegociacoesController. Como a arrow function não tem seu próprio this, ela pega o do contexto que foi declarada.

Este video aborda de maneira bem completa e com exemplos como o this funciona com os diferentes tipos de funções.

Espero ter ajudado! Qualquer outra dúvida pode postar aqui.

Eu entendi que no caso do "This" dentro da Arrow Function o conceito por trás é chamado de "Contexto Léxico". Dessa forma quando não é encontrado, nesse caso, o tal método no contexto onde ela foi executada; este método é procurado no contexto superior e este contexto é o "NegociacoesController".

O this dentro de uma Function Literal é dinâmico, sendo assim, assumindo o valor do contexto de onde for executada a tal Function Literal.

Agradeço pela explicação, Eduardo Tioma .