JavaScript call() Method: A Complete Tutorial with Examples

The call() method in JavaScript is used to call a function with a given this context and arguments provided individually.

It's similar to apply(), but instead of passing an array of arguments, call() accepts them one by one.

Basic Syntax of call()

functionName.call(thisArg, arg1, arg2, ..., argN);

thisArg: The value of this inside the function. It can be any object or primitive value (if it's a primitive, it will be converted to an object).
arg1, arg2, …, argN: A list of arguments to pass to the function.

1. Basic Usage of call()

Example 1: Using call() to Set this Context

function greet(greeting, punctuation) {
  console.log(`${greeting}, my name is ${this.name}${punctuation}`);
}

let person = {
  name: 'Alice'
};

greet.call(person, 'Hello', '!'); // Output: Hello, my name is Alice!

Explanation

The greet function uses this.name to refer to the name property.
Using greet.call(person, ‘Hello', ‘!'), we set this to person and pass the arguments ‘Hello' and ‘!'.

2. Borrowing Methods with call()

One common use case of call() is method borrowing, where an object can use a method from another object.

Example 2: Borrowing Methods from Another Object

let person1 = {
  name: 'Alice',
  greet: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

let person2 = {
  name: 'Bob'
};

// Borrowing the greet method from person1 for person2
person1.greet.call(person2); // Output: Hello, my name is Bob

Explanation

person1 has a greet method that uses this.name.
Using call(person2), we borrow person1.greet and set this to person2.

3. Using call() with Built-in Functions

You can use call() to invoke built-in JavaScript functions with a specified this context.

Example 3: Using call() with Math.max()

let numbers = [3, 5, 1, 8, 2];
let max = Math.max.call(null, 3, 5, 1, 8, 2);

console.log(max); // Output: 8

Explanation

Math.max() is a built-in function that returns the largest of the given numbers.
call() sets the this context to null (since Math.max does not use this internally) and passes individual arguments.

4. Using call() with Array-Like Objects

You can use call() to convert array-like objects (e.g., the arguments object inside a function) into arrays.

Example 4: Converting arguments to an Array

function sum() {
  let argsArray = Array.prototype.slice.call(arguments);
  return argsArray.reduce((acc, current) => acc + current, 0);
}

console.log(sum(1, 2, 3, 4, 5)); // Output: 15

Explanation

arguments is an array-like object containing all the arguments passed to the function.
Array.prototype.slice.call(arguments) converts the arguments object into a true array.
The reduce() method is used to sum the array elements.

5. Using call() for Inheritance

In JavaScript, call() can be used within constructors to invoke another constructor, allowing one object to inherit properties from another.

Example 5: Using call() for Constructor Inheritance

function Person(name, age) {
  this.name = name;
  this.age = age;
}

function Student(name, age, grade) {
  Person.call(this, name, age); // Inherit properties from Person
  this.grade = grade;
}

let student = new Student('John', 20, 'A');
console.log(student.name); // Output: John
console.log(student.age);  // Output: 20
console.log(student.grade); // Output: A

Explanation

The Person constructor initializes name and age.
Inside the Student constructor, Person.call(this, name, age) is used to call the Person constructor, setting this to the new Student instance.
This allows Student to inherit properties (name and age) from Person.

6. Differences Between call(), apply(), and bind()

call(thisArg, arg1, arg2, …): Calls a function with this set to thisArg and arguments passed individually.
apply(thisArg, [argsArray]): Calls a function with this set to thisArg and arguments passed as an array.
bind(thisArg, arg1, arg2, …): Returns a new function with this set to thisArg and optionally preset arguments. It does not immediately invoke the function.

Example 6: Comparing call(), apply(), and bind()

function introduce(greeting, punctuation) {
  console.log(`${greeting}, my name is ${this.name}${punctuation}`);
}

let person = {
  name: 'Charlie'
};

// Using call
introduce.call(person, 'Hi', '!'); // Output: Hi, my name is Charlie!

// Using apply
introduce.apply(person, ['Hello', '?']); // Output: Hello, my name is Charlie?

// Using bind
let boundIntroduce = introduce.bind(person, 'Hey');
boundIntroduce('!'); // Output: Hey, my name is Charlie!

Explanation

call(): Passes arguments individually.
apply(): Passes arguments as an array.
bind(): Returns a new function with this set to the provided context.

7. Using call() with Built-in Methods

Example 7: Using call() to Borrow Array Methods

You can use call() to borrow array methods for array-like objects.

let arrayLikeObject = {
  0: 'apple',
  1: 'banana',
  2: 'cherry',
  length: 3
};

let result = Array.prototype.join.call(arrayLikeObject, ', ');
console.log(result); // Output: apple, banana, cherry

Explanation

arrayLikeObject simulates an array with indexed properties and a length property.
Array.prototype.join.call(arrayLikeObject, ‘, ‘) uses the join method on arrayLikeObject as if it were an array.

8. Using call() for Variadic Functions

When working with variadic functions (functions that accept a variable number of arguments), call() allows you to pass individual arguments in a flexible way.

Example 8: Using call() with Variadic Functions

function logArguments() {
  console.log(arguments);
}

logArguments.call(null, 1, 2, 3, 4); // Output: [Arguments] { '0': 1, '1': 2, '2': 3, '3': 4 }

Explanation

logArguments is a function that logs the arguments object.
call(null, 1, 2, 3, 4) invokes logArguments with null as this and the arguments 1, 2, 3, 4.

Summary

The call() method in JavaScript is a powerful way to control the this context of functions and provide flexibility in passing arguments. Here's a quick recap:

Key Points

call(): Calls a function with a specified this value and arguments passed individually.

Use Cases:

Borrowing Methods: Allows one object to use a method of another object.
Setting Context: Ensures the correct this context when calling a function.
Inheritance: Uses within constructors to inherit properties from other constructors.
Working with Built-in Methods: Borrows array methods for array-like objects.

Common Use Cases

Borrowing methods to use across different objects.
Setting this context explicitly in callback functions or event handlers.
Utilizing built-in methods like Math.max() or Array.prototype.slice() for non-array objects.

By mastering call(), you gain more control over the execution context of functions, making your JavaScript code more versatile and powerful.

Related posts

JavaScript Callbacks: A Complete Tutorial

JavaScript Arrow Functions: A Complete Tutorial

JavaScript apply() Method: A Complete Tutorial with Examples