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(), and bind().


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 specific this context, especially for event handlers or callbacks.


Key Differences Between call, apply, and bind:

MethodInvokes Immediately?Arguments TypeReturns a New Function?
callYesPassed individuallyNo
applyYesPassed as an arrayNo
bindNoPassed individuallyYes

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

  1. Using this in Arrow Functions:

    • Arrow functions do not have their own this context. Instead, they inherit this 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
      
  2. Differences Between apply and call:

    • Use apply() when arguments are in an array format, otherwise use call() for better readability.

Summary

  • call(): Immediately invokes the function with a specified this context, passing arguments individually.

  • apply(): Similar to call(), but passes arguments as an array.

  • bind(): Returns a new function with the this context bound, to be invoked later.

  • Use these methods to reuse functions across different objects, handle events, or manage inheritance effectively.

8
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.