Fundamentos do Trabalho com Contexto em JavaScript

Suponha que temos uma função func, dentro da qual é usado this:

javascriptfunction func() {
  console.log(this.value);
}

Para o que this aponta dentro desta função? E nós não sabemos. E o JavaScript não sabe. E a própria função não sabe. Ou seja, no momento da criação da função, para o que exatamente this aponta não está definido. E isso só será definido quando essa função for chamada.

Suponha que temos algum input:

html<input id="elem" value="text">

Vamos vincular a este input nossa função func para que ela seja executada quando o input perder o foco. Agora, no momento da execução da função, this apontará para o nosso input:

javascriptlet elem = document.querySelector('#elem');

elem.addEventListener('blur', func);
function func() {
  console.log(this.value); // ao perder o foco exibirá 'text'
}

Mas podemos ter não um input, mas vários:

html<input id="elem1" value="text1">
<input id="elem2" value="text2">

E para cada um desses inputs podemos vincular nossa função func. Neste caso, para o primeiro elemento, o this no momento da chamada da função apontará para ele, e para o segundo - para ele.

Na prática, isso significa que this dentro da função depende de em qual dos inputs perdemos o foco:

javascriptlet elem1 = document.querySelector('#elem1');
elem1.addEventListener('blur', func);

let elem2 = document.querySelector('#elem2');
elem2.addEventListener('blur', func);

function func() {
  console.log(this.value); // exibirá ou 'text1', ou 'text2'
}

No geral, essa característica do this é muito conveniente - criamos apenas uma função e a vinculamos a qualquer número de inputs. Se o this não apontasse para o elemento no qual o evento ocorreu, isso não seria possível - teríamos que criar para cada input sua própria função com o mesmo código!