Mastering JavaScript Functions: How to Use call(), apply(), and bind() with Object Contexts


Calling Functions for Different Objects: call()
, apply()
, and bind()
In JavaScript, you can call a function for an object even if the function doesn't belong to that object.
This is achieved using the following methods:
call()
,apply()
, andbind()
.
1. call()
Method
What it does: Invokes a function immediately, with a specified object as the
this
context.How it works: Passes arguments individually to the function.
Syntax:
functionName.call(object, arg1, arg2, ...);
Example:
const person = { name: "Anubhav" }; function greet(greeting, punctuation) { console.log(`${greeting}, ${this.name}${punctuation}`); } greet.call(person, "Hello", "!"); // Output: Hello, Anubhav!
Use Case: Use
call()
when you need to immediately invoke a function and pass arguments individually.
2. apply()
Method
What it does: Similar to
call()
, but it passes arguments as an array.How it works: Invokes the function immediately and uses the specified object as the
this
context.Syntax:
functionName.apply(object, [arg1, arg2, ...]);
Example:
const person = { name: "Anubhav" }; function greet(greeting, punctuation) { console.log(`${greeting}, ${this.name}${punctuation}`); } greet.apply(person, ["Hi", "!"]); // Output: Hi, Anubhav!
Use Case: Use
apply()
when arguments are already in an array format.
3. bind()
Method
What it does: Does not invoke the function immediately. Instead, it returns a new function with the specified object bound as
this
.How it works: Use the returned function whenever needed.
Syntax:
const newFunction = functionName.bind(object, arg1, arg2, ...);
Example:
const person = { name: "Anubhav" }; function greet(greeting, punctuation) { console.log(`${greeting}, ${this.name}${punctuation}`); } const boundGreet = greet.bind(person, "Hey"); boundGreet("!"); // Output: Hey, Anubhav!
Use Case: Use
bind()
when you need to create a new function with a specificthis
context, especially for event handlers or callbacks.
Key Differences Between call
, apply
, and bind
:
Method | Invokes Immediately? | Arguments Type | Returns a New Function? |
call | Yes | Passed individually | No |
apply | Yes | Passed as an array | No |
bind | No | Passed individually | Yes |
Additional Details
Using call
, apply
, and bind
with Inheritance
These methods are particularly useful when borrowing functions from one object and applying them to another object.
Example:
const user1 = { name: "Anubhav", showName: function() { console.log(this.name); } }; const user2 = { name: "Shekhar" }; user1.showName.call(user2); // Output: Shekhar
Passing Different Contexts to Event Handlers
bind()
is frequently used in event handling to ensure the correct context for the callback function.Example:
class Button { constructor(label) { this.label = label; } click() { console.log(`Clicked on: ${this.label}`); } } const button = new Button("Submit"); const handleClick = button.click.bind(button); document.getElementById("myButton").addEventListener("click", handleClick);
Common Pitfalls and Notes
Using
this
in Arrow Functions:Arrow functions do not have their own
this
context. Instead, they inheritthis
from the surrounding lexical scope.Example:
const person = { name: "Anubhav", greet: () => console.log(this.name) // `this` refers to global object, not `person`. }; person.greet(); // Output: undefined
Differences Between
apply
andcall
:- Use
apply()
when arguments are in an array format, otherwise usecall()
for better readability.
- Use
Summary
call()
: Immediately invokes the function with a specifiedthis
context, passing arguments individually.apply()
: Similar tocall()
, but passes arguments as an array.bind()
: Returns a new function with thethis
context bound, to be invoked later.Use these methods to reuse functions across different objects, handle events, or manage inheritance effectively.
Subscribe to my newsletter
Read articles from Anubhav Kumar Gupta directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Anubhav Kumar Gupta
Anubhav Kumar Gupta
I'm Anubhav Kumar Gupta, a passionate Data Engineer at Infometry Inc. with expertise in Python, SQL, and Data Engineering. I love solving complex problems, optimizing data pipelines, and integrating back-end technologies.