Bab 02: Cara JavaScript Bekerja di Browser

Kalau kamu pernah nanya, “Kenapa JavaScript-ku nggak jalan pas halaman dibuka?” atau “Kenapa browser tiba-tiba freeze gara-gara satu baris kode?”, selamat kamu nggak sendirian. Bahkan developer senior pernah nangis diam-diam gara-gara lupa taruh <script> di tempat yang salah.
JavaScript itu kayak asisten pribadi di browser: dia bisa bikin halaman web hidup, interaktif, dan kadang…bikin frustasi kalau nggak dimengerti cara kerjanya. Nah, di bab ini, Jarvis akan bantu kamu ngintip dari balik layar gimana sih sebenarnya JavaScript bekerja di dalam browser? Dari saat kamu klik URL sampai tombol animasi nari-nari, semua ada prosesnya.
Siapkan kopi (atau teh, kalau kamu tim sehat), karena kita bakal bahas semuanya dengan santai, jelas, dan sesekali nyelipin candaan receh biar otak nggak kepanasan. Yuk, mulai!
Gambaran Umum Cara Kerja JavaScript
JavaScript sebagai Bahasa Client-Side
JavaScript itu beda sama PHP atau Python yang jalan di server. Ia adalah client-side language, artinya dia hidup dan bekerja langsung di browser pengguna bukan di server. Jadi, setiap kali kamu buka situs, JavaScript-nya ikut turun bareng HTML dan CSS, lalu dijalankan di komputer atau HP-mu. Keren, kan? Tapi jangan sampe overconfident dia tetap butuh diatur biar nggak bikin chaos.
Apa yang Terjadi Saat Halaman Web Dibuka
Bayangkan browser seperti koki yang baru aja nerima resep (HTML), daftar bumbu (CSS), dan instruksi tambahan (JavaScript). Saat kamu buka halaman, browser mulai membaca HTML baris per baris, sambil sesekali berhenti buat ambil CSS atau JavaScript eksternal. Kalau JavaScript-nya nggak sabaran dan minta akses elemen yang belum dimasak, ya… error deh. Makanya, timing itu penting—kayak jodoh, nggak boleh terlalu cepat atau terlalu lambat.
Proses Loading Halaman Web
Browser Membaca HTML
Browser mulai dari atas: <html>, terus turun ke <head>, lalu <body>. Setiap tag dia proses satu per satu, kayak orang baca novel dari halaman pertama.
Browser Memproses CSS
Sementara HTML dibaca, browser juga ambil file CSS (kalau ada) buat bikin tampilan cantik. Tapi CSS nggak menghentikan parsing HTML jadi halaman tetap bisa lanjut dimuat, meski belum kelihatan gaya-gayaannya.
Urutan Eksekusi JavaScript
Nah, ini bagian krusial. Kalau browser nemu <script>, dia berhenti dulu parsing HTML buat eksekusi JavaScript nya kecuali kamu kasih petunjuk khusus (async atau defer). Ini namanya render blocking. Bayangin lagi masak mie, tiba-tiba disuruh nge-game dulu—mie-nya keburu lembek!
JavaScript Engine di Browser
Apa Itu JavaScript Engine?
Ini adalah “otak” di balik browser yang menerjemahkan kode JavaScript jadi sesuatu yang bisa dimengerti komputer. Tanpa engine ini, JavaScript cuma jadi teks biasa kayak puisi yang nggak pernah dibaca.
Contoh JavaScript Engine di Browser Modern
- V8: Dipake Google Chrome & Edge (ya, Microsoft akhirnya nyerah pake V8 juga)
- SpiderMonkey: Firefox
- JavaScriptCore: Safari
Masing-masing punya kecepatan dan trik sendiri, tapi tujuannya sama: bikin kode kamu jalan secepat kilat.
Peran JavaScript Engine dalam Eksekusi Kode
Engine ini nggak cuma baca kode dia parse, compile (kadang pakai JIT Just-In-Time compilation), lalu eksekusi. Semua itu terjadi dalam hitungan milidetik. Cepet banget, sampai kamu nggak sadar ada ribuan operasi terjadi tiap kali klik tombol “Like”.
Cara Browser Menjalankan JavaScript
Parsing dan Kompilasi JavaScript
Dulu, JavaScript di interpret baris per baris. Sekarang? Hampir semua engine modern pakai teknik campuran: parse dulu, lalu compile ke bytecode/machine code biar lebih cepat. Ini kayak terjemahin resep Italia ke Bahasa Indonesia, terus langsung masak nggak baca sambil masak.
Execution Context
Setiap kali fungsi dipanggil, JavaScript bikin “ruang kerja” bernama execution context. Di sini, variabel, parameter, dan nilai this disimpan. Ada dua jenis utama: global context (saat pertama kali script jalan) dan function context (saat fungsi dipanggil).
Call Stack dan Single Thread
JavaScript itu single-threaded artinya cuma bisa jalanin satu tugas dalam satu waktu. Untuk ngatur urutan, dia pakai call stack: struktur data LIFO (Last In, First Out). Kalau kamu panggil fungsi A → B → C, maka C harus selesai dulu sebelum B dan A. Kalau stack-nya kebanyakan (misal rekursi tanpa henti), browser bakal nge-“Maximum call stack size exceeded”—alias: “Bos, cukup! Saya capek!”
Hubungan JavaScript dengan DOM
Proses Pembentukan DOM
DOM (Document Object Model) adalah representasi pohon dari HTML mu. Saat browser baca HTML, dia bangun DOM node by node. Ini kayak bikin boneka lego dari instruksi manual.
Kapan JavaScript Bisa Mengakses DOM
JavaScript cuma bisa main-main sama DOM setelah node nya dibuat. Kalau kamu coba akses elemen di <body> padahal script-nya ada di <head>, hasilnya? null. Nggak ada yang bisa dipegang kayak cari pacar di bioskop kosong.
Solusinya? Tunggu DOM siap pakai dengan:
document.addEventListener('DOMContentLoaded', () => {
// Baru aman main DOM di sini
});Dampak JavaScript terhadap DOM
JavaScript bisa ubah isi, gaya, bahkan hapus elemen DOM. Tapi hati-hati: setiap perubahan DOM bisa picu reflow atau repaint, yang bikin halaman jadi lemot kalau kebanyakan. Jadi, jangan seenaknya update DOM 1000x/detik browser-mu bukan superkomputer NASA.
Penempatan Script JavaScript
Script di Dalam Tag <head>
Biasanya dipake buat library atau kode yang harus siap sejak awal. Tapi… ini bikin halaman loading jadi lambat, karena parsing HTML berhenti dulu.
Script di Akhir <body>
Best practice klasik! Taruh script di bawah, sebelum </body>. Kenapa? Karena HTML udah selesai dibaca, DOM udah siap, dan JavaScript bisa langsung kerja tanpa nunggu.
Perbedaan async dan defer
async: Script diunduh paralel, tapi langsung dieksekusi begitu selesai tanpa nunggu HTML. Urutannya nggak dijamin. Cocok buat script independen kayak analytics.defer: Script diunduh paralel, tapi eksekusi ditunda sampai HTML selesai diparse. Urutan sesuai urutan tag. Cocok buat script yang butuh DOM lengkap.
Analoginya:
async= temen yang datang duluan ke acara, langsung makan, nggak nunggu yang lain.defer= temen yang datang duluan, tapi sopan nunggu semua hadir baru makan bareng.
JavaScript dan Rendering Halaman
Render Blocking Script
Setiap <script> tanpa async/defer akan memblokir rendering. Browser mikir: “Ah, mungkin script ini mau ubah HTML, mending aku tunggu dulu.” Akibatnya? Layar putih lebih lama. Pengunjung kabur. Penjualan turun. Dunia runtuh. (Okay, mungkin nggak segitunya, tapi tetap buruk.)
Pengaruh JavaScript terhadap Kecepatan Halaman
JavaScript yang berat atau ditempatkan salah = halaman lambat. Dan di era sekarang, kecepatan = uang + SEO. Google suka halaman cepat. Pengguna suka halaman cepat. Jadi, optimasi penempatan dan ukuran script itu wajib—bukan opsional.
Kesalahan Umum Saat Menjalankan JavaScript di Browser
Script Dieksekusi Terlalu Dini
Ini kesalahan klasik: nulis document.getElementById('button') di <head>, padahal <button id="button"> masih di <body>. Hasilnya? null. Solusi: pindah script ke bawah, atau pakai event listener DOMContentLoaded.
Salah Menempatkan File JavaScript
Taruh script besar di <head> tanpa defer? Siap-siap dikomplain user. Gabungin semua script jadi satu file raksasa? Browser harus unduh 2MB dulu sebelum halaman muncul. Lebih baik pisah-pisah, lazy load, atau pakai modul modern.
Nah, sekarang kamu udah ngintip “dapur” browser gimana JavaScript diolah, kapan dia boleh main DOM, dan kenapa penempatan script itu bukan soal selera, tapi soal performa.
Ingat: JavaScript itu powerful, tapi dia bukan superhero yang bisa ngapa-ngapain seenaknya. Dia butuh timing, struktur, dan sedikit empati dari developer (yaitu kamu!). Perlakukan dia dengan baik, maka dia akan balas dengan halaman web yang cepat, responsif, dan bikin user senyum.
Kalau masih bingung, tenang semua developer pernah ngerasa kayak lagi ngobrol sama alien pas pertama kali liat call stack. Yang penting, terus eksperimen, baca error-nya (jangan diabaikan!), dan jangan takut coba-coba.