Olá, Nickolas! Tudo bem?
Quando você escreve const exibir = user.exibirInfos;, você está atribuindo à variável exibir a função exibirInfos do objeto user, mas sem o contexto do objeto user. Isso acontece porque em JavaScript, quando uma função é atribuída a uma variável, ela perde o contexto original (neste caso, o objeto user).
Por isso, quando você tenta executar a função através da variável exibir (ou seja, exibir()), o JavaScript não sabe a que o this se refere e retorna undefined.
Agora, quando você escreve const exibirTudo = exibir.bind(user);, você está utilizando o método bind para atrelar a função exibirInfos ao objeto user novamente. O método bind cria uma nova função que, quando chamada, tem seu this definido com o valor passado, neste caso, o objeto user.
Então, quando você executa exibirTudo(), a função exibirInfos é executada com o contexto do objeto user, e o this dentro da função se refere ao objeto user.
Para exemplificar, veja o código abaixo:
const user = {
nome: "Hanni",
idade: 19,
nascimento: "2004/10/06",
role: "singer",
ativo: true,
exibirInfos: function(){
console.log(this.nome,this.idade)
}
}
// Atribui a função exibirInfos à variável exibir, mas sem o contexto do objeto user
const exibir = user.exibirInfos;
// O this dentro da função exibir se refere ao objeto global, então retorna undefined
exibir(); // undefined
// Atribui a função exibirInfos à variável exibirTudo, com o contexto do objeto user
const exibirTudo = exibir.bind(user);
// O this dentro da função exibirTudo se refere ao objeto user, então retorna as informações do user
exibirTudo(); // Hanni 19
Espero ter ajudado e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.