DEV Community

Tanvir Azad
Tanvir Azad

Posted on

Understanding JavaScript's call, bind, and apply: From Oreo's Perspective

Hello there! I'm Oreo, the black and white cat who spends most of his days lounging on my human's keyboard while they code. I've picked up quite a bit about JavaScript just by watching. Today, I want to explain those confusing call, bind, and apply methods that even my human struggles with sometimes.


Let Me Introduce Myself (and My Friends)

// That's me
const oreo = {
  name: "Oreo",
  color: "black and white",
  favoriteSpot: "keyboard",
  meow: function(loudness, times) {
    for (let i = 0; i < times; i++) {
      console.log(`${this.name} says ${"m" + "e".repeat(loudness) + "ow"}!`);
    }
  }
};

// My neighborhood cat friends
const luna = {
  name: "Luna",
  color: "gray",
  favoriteSpot: "windowsill"
};

const whiskers = {
  name: "Whiskers",
  color: "orange tabby",
  favoriteSpot: "couch"
};
Enter fullscreen mode Exit fullscreen mode

The Call Method: Lending My Abilities

I've noticed that in JavaScript, sometimes you want to let another object use your method. It's like when Luna comes over and wants to meow like me. She doesn't have her own meow method, but she can borrow mine using call.

// Luna borrowing my meow method
oreo.meow.call(luna, 3, 2);
// Output:
// Luna says meeeow!
// Luna says meeeow!
Enter fullscreen mode Exit fullscreen mode

What's happening here? I'm lending my meow method to Luna through call. The first argument to call is who gets to be this inside the function (Luna), and the rest of the arguments are passed to the function as normal (loudness 3, times 2).

From what I observe, call works like this:

It lets you execute a function while explicitly setting what this refers to inside that function. It runs immediately and takes its arguments one by one after the first this argument.


The Apply Method: My Function, Your Array of Arguments

Whiskers likes to be more organized. When he visits, he brings his meow specifications in a neat array. This is where apply comes in handy.

// Whiskers has his parameters organized in an array
const whiskersWants = [5, 1]; // loudness of 5, 1 time

// Using apply with an array of arguments
oreo.meow.apply(whiskers, whiskersWants);
// Output:
// Whiskers says meeeeeeow!
Enter fullscreen mode Exit fullscreen mode

The difference between call and apply is simple from my perspective:

apply does the same thing as call, but it takes its arguments as an array. The first argument is still who gets to be this, but the second argument is an array containing all the parameters. It also executes immediately.


The Bind Method: Creating a Personalized Function

Sometimes Luna stops by when I'm napping. She wanted a way to meow without having to bother me every time. That's where bind comes in - it lets her create her own personalized meow function based on mine.

// Creating a specialized meow function for Luna
const lunaMeow = oreo.meow.bind(luna, 2);

// She can use it whenever she wants
lunaMeow(3);
// Output:
// Luna says meeow!
// Luna says meeow!
// Luna says meeow!

// The first argument (loudness = 2) is preset, but she can change the times
lunaMeow(1);
// Output:
// Luna says meeow!
Enter fullscreen mode Exit fullscreen mode

What makes bind different is:

It doesn't execute the function right away. Instead, it creates a new function with this permanently set to whatever you specified. You can also pre-set some arguments if you want, while leaving others to be filled in later when the function is actually called.


How I Remember the Differences

From my feline perspective, here's how I keep these methods straight:

  1. call - "C" for "Comma-separated arguments" - I call the function now with a specific this and list out all the arguments.

  2. apply - "A" for "Array of arguments" - I call the function now with a specific this and provide an array of arguments.

  3. bind - "B" for "Bookmark for later" - I create a new function with a fixed this that I can call later, and I can optionally preset some arguments.

I've watched my human struggle with these concepts for too long, so I hope my explanation helps you understand them better. Now if you'll excuse me, I need to get back to my nap on the keyboard.

Purrs contentedly

Top comments (0)