What is the difference between apply(), call(), and bind()?

call and apply invoke functions with a specific this value; bind returns a new function with this bound.

function greet(message) {
  console.log(`${message}, ${this.name}`);
}
const person = { name: "Alice" };
greet.call(person, "Hello"); // "Hello, Alice"