In JavaScript, call() and apply() are two functions that serve a specific purpose: calling a function and setting its this value.

To fully grasp their functionality, it is important to have a good understanding of the this variable in JavaScript. You can refer to my comprehensive “this” guide to gain in-depth knowledge about this particular variable.

The this value in a function is determined by the environment and normally cannot be altered from the outside. However, call() and apply() allow you to pass an additional object that will be used as the this value when the function is invoked.

Although call() and apply() achieve the same goal, they differ in terms of how parameters are passed to the function. With call(), you can provide the function parameters as a comma-separated list, allowing you to pass as many parameters as necessary. On the other hand, apply() requires a single array that contains the parameters.

Let’s take a look at an example that demonstrates the usage of call() and apply():

const car = {
  brand: 'Ford',
  model: 'Fiesta'
};

const drive = function(from, to, kms) {
  console.log(`Driving for ${kms} kilometers from ${from} to ${to} with my car, a ${this.brand} ${this.model}`);
};

drive.call(car, 'Milan', 'Rome', 568); // Using call() with comma-separated parameters
drive.apply(car, ['Milan', 'Rome', 568]); // Using apply() with an array of parameters

It’s important to note that call() and apply() are only compatible with regular functions. Arrow functions, for instance, do not bind their own this value, so this method won’t work with them.

In conclusion, call() and apply() are powerful tools in JavaScript that allow you to control the this value when calling a function. By understanding their differences, you can utilize them effectively in your code.