In JavaScript, functions are first-class objects. That means they can be passed around, assigned to variables, and — most importantly — called with different contexts using call(), apply(), and bind().
Let’s break it down simply. 👇
Why Do We Need call, apply, and bind?
Sometimes, you want to change the value of this inside a function — especially when you borrow a method from another object or use it as a callback.
call() Method
Syntax:
functionName.call(thisArg, arg1, arg2, ...)
Example:
const user1 = {
name: "Mohit",
};
function greet(greeting) {
console.log(`${greeting}, ${this.name}`);
}
greet.call(user1, "Hello"); // Output: Hello, Mohit
call() immediately invokes the function and sets this to user1.
apply() Method
Syntax:
functionName.apply(thisArg, [arg1, arg2, ...])
Same as call(), but it takes arguments as an array.
Example:
const user2 = {
name: "Kumar",
};
greet.apply(user2, ["Hi"]); // Output: Hi, Kumar
apply() is great when you already have arguments in an array.
bind() Method
Syntax:
const newFunc = functionName.bind(thisArg, arg1, arg2, ...)
❗ Difference: bind() does not invoke the function immediately — it returns a new function.
Example:
const user3 = {
name: "React Dev",
};
const greetUser3 = greet.bind(user3, "Welcome");
greetUser3(); // Output: Welcome, React Dev
Useful when you want to call the function later, but with a specific this.
Quick Comparison Table
| Method | Changes this? |
Invokes Function? | Arguments Format |
|---|---|---|---|
| call | Yes | Yes | Comma-separated |
| apply | Yes | Yes | Array |
| bind | Yes | No | Comma-separated (then invoked later) |
Real-World Use Case (Method Borrowing)
const person = {
name: "Mohit",
sayHello: function (age) {
console.log(`Hi, I'm ${this.name} and I'm ${age} years old.`);
},
};
const anotherPerson = {
name: "Rahul",
};
person.sayHello.call(anotherPerson, 30); // Hi, I'm Rahul and I'm 30 years old.
Summary
- Use
call()orapply()when you want to invoke a function immediately with a different context. - Use
bind()when you want to create a new function with a bound context for later use.
Practice Tip: Try rewriting small functions using all three to see how they behave differently.
📺 Want a visual explanation? Watch the upcoming YouTube Video on call, apply, and bind on Mohit Decodes
Got stuck? Want to showcase your version? Drop a link or comment below.
📲 Follow me on Instagram or WhatsApp for daily frontend tips.
👍 If this helped, drop a ❤️ or follow me for more quick JS tips!

Top comments (0)