Preparation
πŸ’‘ ⏐ JavaScript Questions
15. Call, Apply, and Bind

Call, Apply, and Bind Functions

JavaScript provides three methods for manipulating the this keyword in functions: call(), apply(), and bind(). These methods allow you to change the context of the this keyword, which can be useful for controlling the behaviour of functions.

call() Method

The call() method allows you to call a function with a specified this value and arguments provided individually. The first argument to call() sets the this value for the function being called, and the remaining arguments are passed to the function as arguments.

function greet(name) {
  console.log(`Hello, ${name}! My name is ${this.name}.`)
}
 
let person = {
  name: 'John',
}
 
greet.call(person, 'Alice') // Output: Hello, Alice! My name is John.

In this example, we define a greet() function that expects a name parameter. We also define a person object with a name property. We then call the greet() function with the call() method, passing in the person object as the this value and "Alice" as the name argument. As simple as that! Just call a method with call() and provide a specific context this as per your choice.

apply() Method

The apply() method is similar to the call() method, but it takes an array of arguments instead of individual arguments. The first argument to apply() sets the this value for the function being called, and the second argument is an array of arguments to pass to the function.

function add(a, b) {
  return a + b
}
 
let numbers = [1, 2]
 
console.log(add.apply(null, numbers)) // Output: 3

In this example, we define an add() function that takes two parameters. We also define an array of numbers [1, 2]. We then call the add() function with the apply() method, passing in null as the this value and numbers as the array of arguments.

bind() Method

The bind() method returns a new function with a specified this value and any arguments that are passed to it. The bind() method does not call the function immediately but instead returns a new function that can be called later.

let person = {
  name: 'John',
  greet: function () {
    console.log(`Hello, my name is ${this.name}.`)
  },
}
 
let greetPerson = person.greet.bind(person)
 
greetPerson() // Output: Hello, my name is John.

In this example, we define a person object with a name property and a greet() method that logs a greeting to the console. We then use the bind() method to create a new function greetPerson with the person object as the this value. We can then call the greetPerson() function to log the greeting.

Advantages

These methods offer several advantages over other techniques for controlling the behavior of functions:

1. Explicitly setting the this keyword:

In JavaScript, the value of the this keyword is determined by how a function is called. By using the call(), apply(), and bind() methods, you can explicitly set the value of the this keyword, regardless of how the function is called. This is especially useful in complex code structures where the value of this may change depending on how functions are nested and called.

2. Flexibility in passing arguments:

The call() and apply() methods allow flexible argument passing to a function. For example, apply() enables passing arguments as an array, which is useful for functions with a variable number of arguments. This enhances code flexibility and readability.

3. Creating new functions with predefined arguments:

The bind() method allows the creation of a new function with a predefined this value and any specified arguments. This is useful when you want to reuse a function with specific context or arguments without redefining them each time. It promotes code reusability and simplifies function invocation.

4. Avoiding repetition of code:

By using call(), apply(), and bind(), you can avoid code repetition for setting the this value or passing arguments to a function. Instead, you create a single function that accepts a this value and arguments, and then use these methods to invoke it with the correct context and arguments. This reduces code duplication and enhances maintainability.

Summary

In summary, call(), apply(), and bind() methods provide powerful means to manipulate the this keyword in JavaScript functions. They offer flexibility, code reusability, and enhance code readability and maintainability by providing explicit control over function invocation context and arguments.