É que no javascript sempre que chamados uma função a partir de um objeto esta função pode acessar o objeto a que ela pertence através da palavra chave 'this'
var person = {
firstName: "John",
lastName : "Doe",
id : 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
}
Porém se você chamar esse método sem ser pelo objeto, a função perde o acesso ao objeto que ela pertence, então 'this' acaba sendo 'undefined' , sendo assim temos que ligar artificialmente o método ao objeto que ela pertence, como no exemplo a seguir.
var person = {
firstName: "John",
lastName : "Doe",
id : 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
}
function executeFuncion(func, obj){
if(obj){
func = func.bind(obj);
}
return func();
}
let fullName = '';
fullName = executeFuncion(person .fullName ); /* aqui da erro porque o this vai ser undefined*/
fullName = executeFuncion(person .fullName, person ); /* aqui vai executar normalmente porque a palavra chave 'this' vai assumir o valor do objeto 'person'.
Segue um link para entender melhor o assunto
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Function/bind