É 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