DEV Community

Cover image for Simplifying call, apply & bind in JavaScript
Md Readwan
Md Readwan

Posted on

Simplifying call, apply & bind in JavaScript

JavaScript allows you to change the context (this value) of functions using call, apply, and bind. These methods might seem tricky at first, but with some simple examples and real-life analogies, you'll get the hang of them. Let's break them down.

The call Method

Think of call as a way to borrow a method from one object and use it with another object.

Real-Life Analogy

Imagine you have a smartphone app that checks your schedule. Your friend also has the same app but hasn't set up their schedule. You can lend your friend your app configuration temporarily so they can see how it works with their schedule.

Example

const person1 = {
  firstName: 'John',
  lastName: 'Doe',
  fullName: function() {
    console.log(this.firstName + ' ' + this.lastName);
  }
};

const person2 = {
  firstName: 'Jane',
  lastName: 'Smith'
};

person1.fullName.call(person2); // Outputs: Jane Smith
Enter fullscreen mode Exit fullscreen mode

Here, person1 has a method to print their full name. Using call, person2 can borrow this method and print their own full name.

The apply Method

apply is similar to call, but it takes arguments as an array.

Real-Life Analogy

Imagine you're at a restaurant ordering food. Instead of telling the waiter each item individually, you hand over a list of items to the waiter.

Example

function sum(a, b) {
  console.log(a + b);
}

sum.apply(null, [5, 10]); // Outputs: 15
Enter fullscreen mode Exit fullscreen mode

In this example, apply calls the sum function with the arguments 5 and 10 provided as an array.

The bind Method

bind creates a new function that, when called, has its this value set to the provided value. It's like permanently lending your app configuration to your friend so they can use it whenever they want.

Real-Life Analogy

Suppose you have a special TV remote that only works with your TV. You can make a duplicate remote that works with your friend's TV permanently.

Example

const module = {
  x: 42,
  getX: function() {
    return this.x;
  }
};

const retrieveX = module.getX;
console.log(retrieveX()); // Outputs: undefined (because 'this' is not module)

const boundGetX = retrieveX.bind(module);
console.log(boundGetX()); // Outputs: 42
Enter fullscreen mode Exit fullscreen mode

In this example, bind creates a new function boundGetX that always uses module as its this value.

Practical Use Cases

1. Borrowing Methods

You can use call to borrow methods from other objects.

const person = {
  name: 'Alice',
  greet: function() {
    console.log('Hello, ' + this.name);
  }
};

const anotherPerson = {
  name: 'Bob'
};

person.greet.call(anotherPerson); // Outputs: Hello, Bob
Enter fullscreen mode Exit fullscreen mode

2. Using apply for Math Functions

apply is useful for passing arrays to functions like Math.max.

const numbers = [5, 6, 2, 3, 7];
const max = Math.max.apply(null, numbers); 
console.log(max); // Outputs: 7
Enter fullscreen mode Exit fullscreen mode

3. Pre-setting Function Arguments

bind can be used to create functions with preset arguments.

function multiply(a, b) {
  return a * b;
}

const double = multiply.bind(null, 2);
console.log(double(5)); // Outputs: 10
Enter fullscreen mode Exit fullscreen mode

Here, bind creates a new function double where a is always 2, making it easy to double any number.

Conclusion

Understanding call, apply, and bind helps you control how functions are executed in JavaScript. They allow you to change the this value and pre-set arguments, making your code more flexible and reusable. By mastering these methods, you can write cleaner and more efficient JavaScript code.

Top comments (0)