quiz/js: difference between .call and .apply (#449)

This commit is contained in:
Nitesh Seram 2024-06-05 05:58:26 +05:30 committed by GitHub
parent e72cf27ff9
commit 8421624f4e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 94 additions and 0 deletions

View File

@ -2,6 +2,15 @@
title: What's the difference between `.call` and `.apply`?
---
## TL;DR
`.call` and `.apply` are used to invoke functions with a specific this context and arguments. The primary difference lies in how they accept arguments:
- `.call(thisArg, arg1, arg2, ...)`: Takes arguments individually.
- `.apply(thisArg, [argsArray])`: Takes arguments as an array.
---
Both `.call` and `.apply` are used to invoke functions and the first parameter will be used as the value of `this` within the function. However, `.call` takes in comma-separated arguments as the next arguments while `.apply` takes in an array of arguments as the next argument. An easy way to remember this is C for `call` and comma-separated and A for `apply` and an array of arguments.
```js
@ -12,3 +21,88 @@ function add(a, b) {
console.log(add.call(null, 1, 2)); // 3
console.log(add.apply(null, [1, 2])); // 3
```
With ES6 syntax, we could write the syntax of `call` using spread operator.
```js
function add(a, b) {
return a + b;
}
console.log(add.call(null, ...[1, 2])); // 3
```
## Use Cases
### Dynamic Function Invocation
```js
function add(a, b) {
return a + b;
}
console.log(add.call(null, 1, 2)); // 3
console.log(add.apply(null, [4, 5])); // 9
```
Both `.call` and `.apply` allow dynamic invocation of functions with specific arguments.
### Context Management
```js
const person = {
name: 'John',
greet() {
console.log(`Hello, my name is ${this.name}`);
},
};
const anotherPerson = { name: 'Alice' };
person.greet.call(anotherPerson); // Hello, my name is Alice
person.greet.apply(anotherPerson); // Hello, my name is Alice
```
`.call` and `.apply` can set the this context explicitly when invoking methods on different objects.
### Function Borrowing
```js
function greet() {
console.log(`Hello, my name is ${this.name}`);
}
const person1 = { name: 'John' };
const person2 = { name: 'Alice' };
greet.call(person1); // Hello, my name is John
greet.call(person2); // Hello, my name is Alice
```
Both `.call` and `.apply` allow borrowing methods from one object and using them in the context of another.
### Array Manipulation
```js
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
Array.prototype.push.apply(arr1, arr2);
console.log(arr1); // [1, 2, 3, 4, 5, 6]
```
`.apply` is commonly used for concatenating or manipulating arrays by passing them as arguments.
## Follow-Up Questions
- How do `.call` and `.apply` differ from `Function.prototype.bind`?
## Practice
- Try implementing your own [`Function.prototype.call` method](/questions/javascript/function-call) and [`Function.prototype.apply` method](/questions/javascript/function-apply) on GreatFrontEnd.
## Further Reading
- [Function.prototype.call | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
- [Function.prototype.apply | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)