The only difference between the methods, call () , apply () , and bind () is in the invocation.
The call () method calls a function with a value this assigned and arguments provided individually.
person.getFullname.call(); // 'name2'
person.getFullname.call(this); // 'name1'
person.getFullname.call(person); // 'name1'
person.getFullname.call(person.last); // 'name3'
person.getFullname.call({ fullname: 'hola' }); // 'hola'
The apply () method invokes a certain function by assigning explicitly the this object and an array or object such as arguments for that function.
person.getFullname.apply(); // 'name1'
person.getFullname.apply(this); // 'name1'
person.getFullname.apply(person); // 'name2'
person.getFullname.apply(person.last); // 'name3'
person.getFullname.apply({ fullname: 'hola' }); // 'hola'
The bind () method creates a new function, which when it is called, it assigns to its operator this the delivered value, with a sequence of arguments given preceding any delivered when the function is called.
person.getFullname.bind()(); // 'name1'
person.getFullname.bind(this)(); // 'name1'
person.getFullname.bind(person)(); // 'name2'
person.getFullname.bind(person.last)(); // 'name3'
person.getFullname.bind({ fullname: 'hola' })(); // 'hola'
Source: link