ReviseAlgo Logo

Objects & Prototypes

call, apply, bind

Master explicit context binding in JavaScript. Contrast call, apply, and bind, and explore patterns for borrowing object methods.

Last Updated: July 15, 2026 10 min read

1. Introduction

JavaScript functions are objects that have built-in methods on their prototype. The three most important methods for managing execution context are call, apply, and bind, which allow you to specify the value of this explicitly.

2. Why It Matters

Explicit binding lets you borrow methods from other objects, configure parameters ahead of time (partial application), and bind event handler methods to their class contexts.

3. Real-World Analogy

Think of a Rental Sports Car:

  • Normal Invocation: You drive your own car (implicit context).
  • call / apply (Day Rental): Renting a sports car for a day. You step into the driver's seat (bind context) and run the car immediately. The only difference is how you load luggage: loading bags one-by-one (call) or packing everything into a single storage container (apply).
  • bind (Reserving a Car): Reserving the car for next weekend. You don't drive it immediately. The rental company hands you a reserved key (returns a new bound function) that you can use to start the car later.

4. Explicit Binding Methods

Let's explore the syntax and behavior of the three methods:

1. Function.prototype.call:

Invokes the function immediately, binding this to the first argument. Subsequent arguments are passed individually, separated by commas.

2. Function.prototype.apply:

Invokes the function immediately, binding this to the first argument. Subsequent arguments must be passed together inside a single array.

3. Function.prototype.bind:

Returns a new function with its this value locked to the provided context. It does not invoke the function immediately. You can also pass initial arguments to configure the function (partial application).

5. Comparison Summary

Method Execution Time Argument Format Return Value
call Immediate Comma-separated list Function output
apply Immediate Single array Function output
bind Deferred Comma-separated list New bound function

6. Practical Example

This script demonstrates borrowing array validation helper methods for a custom event log collector:

7. Common Mistakes

  • Trying to re-bind arrow functions: Arrow functions lock their context lexically when defined. Attempts to modify their context using call, apply, or bind are silently ignored.
  • Calling bind and expecting immediate execution: Forgetting that bind returns a function reference and does not run the code immediately.

8. Quick Quiz

Q1: Which method returns a new function with a locked context rather than executing it immediately?

A) apply()

B) bind()

Answer: B — bind() returns a new function wrapper with the context pre-bound, ready to be called later.

9. Scenario-Based Challenge

The Partial API Configurator:

You write a requester function: request(serverUrl, path, callback). Use bind to pre-configure the function with a specific serverUrl parameter, returning a simpler fetchFromStaging(path, callback) function.

10. Debugging Exercise

Identify and fix the argument mapping bug below:

const numbers = [5, 10, 15];

// Objective: find the maximum value inside the array using Math.max const maxVal = Math.max.call(null, numbers); console.log(maxVal); // logs NaN! Why?

View Solution

Diagnosis: call passes the array itself as a single argument: Math.max([5, 10, 15]). Since Math.max expects numeric arguments, it fails to parse the array and returns NaN.

Fix: Use apply to pass the array elements as individual arguments, or use the spread operator:

// Option 1: Using apply
const maxVal = Math.max.apply(null, numbers);

// Option 2: Using modern spread operator const maxVal2 = Math.max(...numbers);

11. Interview Questions

🟢 Q1: Contrast call() and apply() in detail.

Answer: Both call and apply invoke the function immediately and bind its this context to the first argument. The only difference is how they accept subsequent arguments:
call accepts arguments as a comma-separated list: func.call(context, arg1, arg2).
apply accepts arguments together inside a single array: func.apply(context, [arg1, arg2]).

12. Production Considerations

  • Performance of Bind: Calling .bind() creates a new function wrapper instance, which adds memory overhead. Avoid binding functions inside high-frequency loops or rendering paths (like React rendering returns); instead, bind methods once in the constructor.