JavaScript dirancang pada era web yang mengutamakan “halaman tetap tampil, apa pun yang terjadi”. Untuk itu engine lama memilih memaafkan banyak kesalahan: variabel tanpa deklarasi tetap dibuat, penulisan ke properti yang tidak boleh diubah ditelan diam-diam. Sifat toleran itu bermata dua — program tetap berjalan, tetapi kesalahan menumpuk tanpa suara dan baru terlihat jauh dari sumbernya. Strict mode adalah saklar yang membalik kebijakan tersebut: banyak ketidakpatuhan yang tadinya lolos kini menjadi error dengan pesan yang jelas.
Chapter ini membuktikan perbedaan mode santai (sloppy) dan mode ketat langsung di Node, membahas cara mengaktifkannya di berkas script maupun module, dan merangkum perilaku lain yang ikut berubah.
Mengaktifkan Strict Mode #
Cara mengaktifkannya adalah menulis directive "use strict"; sebagai statement pertama berkas (atau statement pertama di dalam sebuah function). Directive ini sekadar string literal — berkasnya tetap valid bagi engine lama yang tidak mengenalnya, sementara engine modern membacanya sebagai perintah: “jalankan berkas ini dalam mode ketat”.
Dua hal penting tentang posisi directive:
"use strict";hanya aktif jika berdiri sebagai statement pertama. Satu statement apa pun di atasnya membuat directive diabaikan dan mode santai tetap berlaku.- Cakupannya bisa dipersempit: directive di awal berkas mengikat seluruh berkas, sedangkan directive di baris pertama badan function hanya mengikat function tersebut.
Mode Santai di Node: Kesalahan yang Lolos #
Node menjalankan berkas berekstensi .js sebagai script — mode bawaannya adalah mode santai kecuali kita menaruh directive. Berkas berikut sengaja membuat satu kesalahan klasik: mengisi variabel tanpa mendeklarasikannya:
// mode-santai.js
// Tanpa "use strict" — Node menjalankan berkas .js biasa dalam mode lama (sloppy).
nilaiOmzet = 4500000; // tanpa let/const: JS diam-diam membuat variabel global
console.log("Omzet:", nilaiOmzet);
console.log("Menempel di globalThis:", globalThis.nilaiOmzet);Output yang Dihasilkan:
Omzet: 4500000
Menempel di globalThis: 4500000Mari kita telaah apa yang terjadi:
- Baris 4 (
nilaiOmzet = 4500000;): dalam mode santai, assignment ke nama yang belum dideklarasikan tidak memunculkan error. Engine diam-diam membuat variabel baru yang menempel pada global object. - Baris 6 (
console.log("Omzet:", nilaiOmzet);): pembacaan berhasil karena variabel memang ada — kesalahan tersimpan rapi, tanpa jejak di keluaran. - Baris 7 (
console.log("Menempel di globalThis:", globalThis.nilaiOmzet);):globalThisadalah objek global yang tersedia di Node maupun browser. Nilainya (4500000) membuktikan bahwa variabel “liar” itu ikut menempel di sana — berbagi ruang dengan seluruh kode lain yang berjalan di lingkungan yang sama.
Dampak nyatanya: variabel liar bisa tertimpa oleh bagian program lain yang tidak saling kenal, dan kesalahan typo pada nama variabel tidak pernah terdeteksi. Kedua-duanya sulit dilacak karena tidak ada pesan error untuk dipelajari.
Mode Ketat: Kesalahan yang Sama, Kali Ini Tertangkap #
Berkas berikut memuat kesalahan yang sama persis, kali ini di bawah directive "use strict";:
// mode-ketat.js
// "use strict" wajib menjadi statement pertama agar mode ketat aktif.
"use strict";
let nilaiOmzet = 4500000;
console.log("Omzet:", nilaiOmzet);
try {
omzetTahunLalu = 3000000; // lupa deklarasi: kini terdeteksi sebagai error
} catch (error) {
console.log(error.name, "-", error.message);
}
console.log("Program masih berjalan sampai baris terakhir.");Output yang Dihasilkan:
Omzet: 4500000
ReferenceError - omzetTahunLalu is not defined
Program masih berjalan sampai baris terakhir.Mari kita telaah:
- Baris 4 (
"use strict";): directive berdiri sebagai statement pertama, sehingga seluruh berkas dieksekusi dalam mode ketat. - Baris 6–7 (
let nilaiOmzet = 4500000;dst.): kode yang benar tidak terganggu sama sekali — strict mode bukan aturan baru yang perlu “dipatuhi” dengan gaya penulisan berbeda, melainkan pengawas atas kesalahan. - Baris 10 (
omzetTahunLalu = 3000000;): assignment tanpa deklarasi kini memunculkanReferenceError: omzetTahunLalu is not defined. Pesan tersebut langsung menunjuk nama variabel yang bermasalah — titik awal pelacakan yang jelas. - Baris 15 (
console.log("Program masih berjalan ...");): karena errornya tertangkaptry-catch, program terbukti tetap berjalan sampai akhir. Dalam kerja nyata, error semacam ini justru kita biarkan muncul agar typo segera terlihat.
ES Module Selalu Ketat #
Ada satu jalur yang tidak memerlukan directive sama sekali: ES module. Node menjalankan berkas berekstensi .mjs sebagai module, dan seluruh kode module otomatis dieksekusi dalam mode ketat — di browser pun, <script type="module"> berlaku sama. Berkas berikut tanpa directive, tetapi perilakunya sama dengan mode-ketat.js:
// modul-ketat.mjs
// Berkas .mjs dijalankan Node sebagai ES module: strict mode aktif otomatis.
let pelangganAktif = 128;
try {
pelangganBaru = 12; // tanpa deklarasi, tanpa directive "use strict"
} catch (error) {
console.log(error.name, "-", error.message);
}
console.log("Pelanggan aktif:", pelangganAktif);Jalankan perintah berikut di terminal (perhatikan ekstensi .mjs):
node modul-ketat.mjsOutput yang Dihasilkan:
ReferenceError - pelangganBaru is not defined
Pelanggan aktif: 128Tanpa satu pun directive, berkas .mjs tetap menolak assignment tanpa deklarasi. Karena ekosistem modern bergerak ke arah module (section Modules membahasnya secara penuh), banyak proyek mendapatkan mode ketat “gratis” dari pilihan struktur berkasnya.
Perilaku Lain yang Berubah di Mode Ketat #
Assignment tanpa deklarasi hanyalah contoh paling terkenal. Mode ketat juga mengubah kesalahan-kesalahan berikut menjadi error:
- Penulisan ke properti yang tidak boleh diubah — misalnya properti hasil
Object.freeze()— dari diam-diam gagal menjadiTypeError. - Nama parameter function yang sama dua kali — misalnya
function hitung(total, total)— dari kebiasaan aneh yang sah menjadiSyntaxError. - Literal oktal gaya lama seperti
0777— dari angka bernilai berbeda menjadiSyntaxError. - Statement
with— struktur yang membuat pencarian nama jadi tidak jelas — dilarang total. thisdi dalam function biasa tidak lagi mengarah ke global object, melainkanundefined— detailnya kita kupas saat membahas function dan object.
Sampai di sini, kita sudah mampu menulis kode yang rapi, bernama baik, dan berjalan dalam mode yang tegas. Namun kesalahan tetap akan muncul — chapter terakhir section ini melengkapi kita dengan cara menemukan dan memperbaikinya secara sistematis.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
mode-ketat.js
Unduh berkas// mode-ketat.js
// "use strict" wajib menjadi statement pertama agar mode ketat aktif.
"use strict";
let nilaiOmzet = 4500000;
console.log("Omzet:", nilaiOmzet);
try {
omzetTahunLalu = 3000000; // lupa deklarasi: kini terdeteksi sebagai error
} catch (error) {
console.log(error.name, "-", error.message);
}
console.log("Program masih berjalan sampai baris terakhir.");
mode-santai.js
Unduh berkas// mode-santai.js
// Tanpa "use strict" — Node menjalankan berkas .js biasa dalam mode lama (sloppy).
nilaiOmzet = 4500000; // tanpa let/const: JS diam-diam membuat variabel global
console.log("Omzet:", nilaiOmzet);
console.log("Menempel di globalThis:", globalThis.nilaiOmzet);