1. "undefined is not a function"
Error klasik ini sudah menemani developer JavaScript sejak jaman jQuery masih berjaya. Biasanya muncul karena typo nama function, atau memanggil method dari object yang belum di-initialize. Yang paling menyebalkan adalah error ini sering muncul tanpa stack trace yang jelas, bikin kamu harus hunting baris per baris.
// Contoh klasik
const user = null;
user.getName(); // TypeError: Cannot read properties of null
// Fix: gunakan optional chaining
const name = user?.getName() ?? "Guest";
2. Callback Hell
Sebelum ada Promise dan async/await, developer harus berhadapan dengan pyramid of doom — callback di dalam callback di dalam callback. Kode jadi susah dibaca, susah di-debug, dan susah di-maintain. Untungnya sekarang kita punya async/await yang bikin kode asynchronous terasa seperti synchronous.
// Callback hell (jangan ditiru)
getData(function(a) {
getMoreData(a, function(b) {
getEvenMoreData(b, function(c) {
console.log("Finally!", c); // indent nightmare
});
});
});
// Modern approach
const a = await getData();
const b = await getMoreData(a);
const c = await getEvenMoreData(b);
console.log("Clean!", c);
3. "this" yang Membingungkan
Konteks this di JavaScript adalah salah satu konsep yang paling sering bikin bingung, terutama buat developer yang datang dari bahasa lain seperti Java atau PHP. Nilainya bisa berubah tergantung bagaimana function dipanggil. Solusinya? Gunakan arrow function yang secara otomatis bind ke parent scope.
Selain tiga error di atas, masih ada "CORS error" yang bikin frustrasi saat develop API, dan "Maximum call stack exceeded" yang muncul karena infinite recursion. Semua error ini pada akhirnya adalah guru terbaik — setiap kali kamu fix satu bug, skill debugging kamu naik level.