# ⚡ Memahami Perbedaan call() dan apply() di JavaScript

Dalam JavaScript, fungsi adalah *first-class citizen*, artinya fungsi dapat diperlakukan seperti nilai. Salah satu kemampuan penting adalah mengendalikan konteks `this` secara manual menggunakan `call()` dan `apply()`.

Meski keduanya mirip, ada satu perbedaan utama yang wajib dipahami: **cara mengirimkan argumen**.

## 🔹 Apa Itu `call()`?

`call()` menjalankan fungsi sambil menetapkan nilai `this`, lalu mengirimkan argumen **satu per satu**.

```javascript
function greet(city, country) {
  console.log(`Hello, I am ${this.name} from ${city}, ${country}`);
}

const user = { name: "Safei" };
greet.call(user, "Solo", "Indonesia");
```

## 🔹 Apa Itu `apply()`?

`apply()` juga menjalankan fungsi sambil mengatur nilai `this`, tetapi argumen harus dikirim dalam **array**.

```javascript
greet.apply(user, ["Solo", "Indonesia"]);
```

---

## ⚠️ Perbedaan Utama

| Method | Cara Kirim Argumen | Eksekusi |
| --- | --- | --- |
| **call()** | argumen dipisah | [`func.call`](http://func.call)`(obj, a, b, c)` |
| **apply()** | argumen array | `func.apply(obj, [a, b, c])` |

## 🧠 Mana yang Harus Dipakai?

### Gunakan `call()` ketika:

* Kamu sudah punya argumen terpisah
    
* Ingin mengeksekusi fungsi langsung dengan konteks tertentu
    

### Gunakan `apply()` ketika:

* Kamu ingin mengirimkan argumen berbentuk array
    
* Kamu bekerja dengan data seperti hasil `Math.max`, `spread`, dll
    

---

## 💡 Catatan Modern (ES6+)

Sejak hadirnya **spread operator**, penggunaan `apply()` semakin jarang:

```javascript
func.call(obj, ...argsArray);
```

Dengan ini, `apply()` tidak lagi wajib, tetapi tetap penting untuk dipahami demi memahami pola JavaScript klasik.

---

## 🎯 Kesimpulan

* `call()` dan `apply()` sama-sama untuk mengatur nilai `this`.
    
* Bedanya hanya pada **cara mengirimkan argumen**.
    
* Di JavaScript modern, `call()` + spread sering menjadi pilihan utama.
    
* Meski sederhana, keduanya adalah fondasi untuk memahami *function binding*, *method borrowing*, dan *OOP style* di JavaScript.
