JavaScript tidak pernah dimaksudkan untuk menjadi seperti sekarang ini. Pada tahun 1995, Brendan Eich duduk di Netscape dan merancang sebuah prototipe dalam sepuluh hari. Sepuluh hari. Itu nyaris tidak cukup waktu untuk menulis spesifikasi yang layak, apalagi merancang bahasa pemrograman yang ditujukan untuk menggerakkan miliaran perangkat. Hasilnya adalah sebuah bahasa dengan keunikan (quirks) yang masih membuat pengembang tersandung hampir tiga dekade kemudian. Namun, kreasi yang terburu-buru itu justru menjadi runtime yang paling banyak digunakan dalam sejarah perangkat lunak. Ia menang bukan karena keanggunannya, melainkan karena ia hadir di dalam browser tepat pada saat web membutuhkannya.

Lahir dalam Ketergesaan

Perang browser di pertengahan sembilan puluhan bukanlah kompetisi yang bersahabat. Netscape membutuhkan bahasa skrip ringan yang dapat berjalan berdampingan dengan Java di browser Navigator miliknya. Eich ditugaskan untuk membangun sesuatu yang terlihat cukup mirip dengan Java untuk menenangkan para eksekutif, namun cukup sederhana bagi non-programmer untuk ditempelkan ke halaman web. Tenggat waktunya sangat tidak masuk akal. Ia menghasilkan Mocha, yang segera berganti nama menjadi LiveScript, dan akhirnya JavaScript sebagai strategi pemasaran untuk memanfaatkan popularitas Java.

Kelahiran yang terburu-buru itu meninggalkan bekas luka permanen. Koersi tipe (type coercion) masih membingungkan pendatang baru ketika operator plus menggabungkan string dan angka tanpa peringatan. typeof null mengembalikan "object" karena adanya bug pada implementasi aslinya yang tidak berani diperbaiki oleh siapa pun karena takut merusak web. Penyisipan titik koma otomatis (automatic semicolon insertion) menyebabkan kegagalan yang tidak terdeteksi (silent failures). Variabel yang dideklarasikan dengan var membocorkan scope dengan cara yang terasa tidak terprediksi. Ini bukanlah cacat desain yang abstrak. Ini adalah frustrasi sehari-hari yang berakar langsung dari sprint dua minggu pada Mei 1995.

Silsilah yang Aneh

Perhatikan JavaScript baik-baik dan Anda akan melihat tiga garis keturunan berbeda yang dijahit menjadi satu. Sintaksnya banyak meminjam dari Java. Kurung kurawal, pernyataan if, dan loop for memberikan bentuk yang akrab bagi siapa pun yang berasal dari bahasa bergaya C. Namun di balik permukaan itu, perilakunya sepenuhnya berbeda.

Jantung komputasi bahasa ini berasal dari Scheme, sebuah dialek Lisp. Di sinilah JavaScript mendapatkan first-class functions, yang berarti fungsi dapat dikirim sebagai argumen, dikembalikan dari fungsi lain, dan ditetapkan ke variabel. Ini juga memberi kita closures, yang memungkinkan fungsi dalam untuk mengakses scope fungsi luar bahkan setelah fungsi luar tersebut selesai dieksekusi. Jika Anda pernah menulis callback atau memasang event listener, Anda telah menggunakan DNA yang diwarisi dari Scheme.

Kemudian ada model objek, yang berasal dari Self. Alih-alih pewarisan klasik dengan kelas yang kaku, JavaScript menggunakan prototipe. Sebuah objek dapat terhubung langsung ke objek lain dan mendelegasikan pencarian properti ke atas. Anda dapat membuat objek dengan Object.create dan membangun rantai tanpa pernah mendefinisikan kelas. JavaScript modern menambahkan kata kunci class, tetapi itu sebagian besar hanyalah syntactic sugar di atas mesin prototipe yang mendasarinya.

Dari Sekadar Dekorasi Halaman Menjadi Alat Serius

Selama beberapa tahun pertamanya, JavaScript melakukan tugas-tugas kecil. Ia memvalidasi input formulir sebelum pengiriman mencapai server. Ia menukar gambar saat kursor diarahkan (mouse hover). Ia hanyalah sebuah mainan, bukan sebuah alat. Implementasi browser tidak konsisten, sehingga pengembang sering menulis jalur kode yang berbeda untuk Netscape dan Internet Explorer.

Standardisasi melalui ECMAScript mengubah lintasan tersebut. Spesifikasi tersebut memberikan target umum bagi vendor browser untuk diimplementasikan, yang secara perlahan meratakan ketidakcocokan yang paling parah. Kemudian muncullah Ajax.

Ajax, singkatan dari Asynchronous JavaScript and XML, bukanlah satu teknologi baru melainkan sebuah pola yang menggabungkan bagian-bagian yang sudah ada. Bahan utamanya adalah objek XMLHttpRequest, yang memungkinkan browser meminta data ke server di latar belakang tanpa memuat ulang seluruh halaman. Ketika Google meluncurkan Maps pada tahun 2005 dan Gmail pada tahun 2004, pengguna tiba-tiba merasakan responsivitas layaknya aplikasi desktop di dalam tab browser. Halaman web menjadi aplikasi. JavaScript bukan lagi sekadar hiasan. Ia adalah hidangan utamanya.

Kecepatan dan Ambisi

Performa mentah dulunya adalah lelucon terbesar JavaScript. Interpreter awal sangat lambat. Kemudian Google merilis mesin V8 pada tahun 2008 bersamaan dengan Chrome, dan lelucon itu tidak lagi lucu. V8 memperkenalkan just-in-time compilation, yang menerjemahkan JavaScript ke dalam kode mesin saat runtime, alih-alih menginterpretasikannya baris demi baris. Ia memperkenalkan hidden classes dan inline caching untuk membuat akses properti menjadi cepat bahkan pada objek dinamis. Browser lain merespons dengan mesin berkecepatan tinggi mereka sendiri, dan bahasa tersebut tiba-tiba menjadi cukup cepat untuk komputasi nyata.

Kecepatan tersebut memungkinkan pergeseran berikutnya. Ryan Dahl merilis Node.js pada tahun 2009, mengeluarkan V8 dari browser dan membungkusnya dalam model input-output non-blocking yang berbasis event. Server web dulunya membuat thread baru untuk setiap permintaan yang masuk, yang kemudian tumbang di bawah konkurensi yang berat. Node.js menangani puluhan ribu koneksi simultan pada satu thread tunggal menggunakan event loop dan callback asinkron. JavaScript meluap dari sisi client ke sisi server, ke dalam build tools, dan akhirnya ke segala hal lainnya.

Bahasa yang Ada di Mana-mana

Sekarang JavaScript berjalan di tempat-tempat yang tidak pernah dibayangkan oleh penciptanya.

Di frontend, React dan Vue membentuk cara antarmuka modern dibangun. Komponen diperbarui sebagai respons terhadap perubahan state tanpa browser harus melakukan pemuatan ulang halaman penuh yang memakan banyak sumber daya. Di backend, Node.js menggerakkan API dan layanan real-time, sementara runtime yang lebih baru seperti Bun bereksperimen dengan manajemen paket yang lebih cepat dan bundling bawaan.

React Native menerjemahkan kode JavaScript ke dalam tampilan platform native, memungkinkan tim untuk merilis aplikasi seluler untuk iOS dan Android tanpa harus memelihara dua basis kode yang sepenuhnya terpisah dalam Swift dan Kotlin. Electron membungkus teknologi web di dalam shell Chromium untuk membangun perangkat lunak desktop, yang merupakan cara Slack dan Visual Studio Code menjangkau laptop Anda. Bahasa ini bahkan berada di dalam cloud functions dan edge computing workers, mengeksekusi logika hanya dalam hitungan milidetik dari pengguna akhir di seluruh jaringan terdistribusi.

Paradoks Kelimpahan

Keberadaan di mana-mana memiliki konsekuensi. Ekosistemnya sangat besar, dan ukuran tersebut menimbulkan kecemasan. Sebuah build tool baru muncul bahkan sebelum Anda selesai mengonfigurasi yang terakhir. Framework naik dan turun popularitasnya dalam lini masa yang terasa seperti musim. Anda dapat memecahkan hampir semua masalah tanpa meninggalkan dunia JavaScript, tetapi Anda harus terlebih dahulu memilih di antara selusin solusi yang sangat opinionated. Pohon dependensi tumbuh semakin dalam dan rapuh. Sebuah paket untuk left-padding array dapat merusak ribuan proyek hilir ketika paket tersebut menghilang dari registry.

Semua ini tidak terjadi secara kebetulan. JavaScript berantakan karena web juga berantakan. Ia adalah lapisan kue organik dari kompatibilitas mundur, standar yang terburu-buru, dan kepentingan implementasi yang saling bersaing. Namun kekacauan yang sama itulah yang membuat bahasa ini kuat. Web ada di mana-mana, dan karena JavaScript secara default hidup di dalam setiap browser, ia adalah hal terdekat yang kita miliki dengan runtime universal.

Ia sudah lama berhenti menjadi sekadar bahasa scripting. JavaScript kini menjadi platform perangkat lunak global, dibangun dalam sepuluh hari, disatukan oleh kontrak tak terlihat bahwa web tidak boleh merusak apa yang sudah ada sebelumnya. Pelajari bekas lukanya bersama dengan kekuatannya, dan Anda sedang mempelajari sejarah internet modern itu sendiri.