Strict mode adalah varian JavaScript yang lebih ketat
JavaScript punya sejarah panjang, dan ia membawa banyak keputusan yang patut dipertanyakan: assignment yang diam-diam membuat variabel global, this yang berubah arti tergantung cara kamu memanggil fungsi, nama parameter ganda yang ternyata... jalan saja. Mengubah salah satunya akan merusak web, jadi TC39 (komite yang mengelola bahasa ini) memilih jalan lain: mode opsional yang menumpulkan sisi-sisi tajam itu.
Mode opsional itu disebut strict mode. Kamu menyalakannya dengan satu baris di bagian atas file atau fungsi:
Jalankan, dan kamu akan mendapat ReferenceError: x is not defined. Tanpa direktif itu, kode yang sama dengan senang hati membuat variabel global bernama x dan mencetak 10. Bahasanya sama, aturannya berbeda.
Direktif 'use strict'
Direktif ini hanyalah string literal: 'use strict'; atau "use strict";. Ia harus menjadi pernyataan pertama di script atau fungsi. Kalau ada apa pun sebelumnya, bahkan satu ekspresi nyasar, engine menganggapnya string biasa dan mengabaikannya.
Kamu bisa membatasi strict mode ke satu fungsi saja dengan menaruh direktifnya di dalam fungsi itu. Dalam praktiknya, sekarang tidak ada lagi yang melakukan ini: kamu menulis module (strict secara default) atau menyalakannya untuk seluruh file.
Apa yang sebenarnya diubah strict mode
Strict mode bukan satu aturan, melainkan satu paket. Sorotannya:
- Assignment ke variabel yang belum dideklarasikan melempar error alih-alih membuat variabel global.
thisdi dalam pemanggilan fungsi biasa bernilaiundefined, bukan object global.- Nama parameter ganda (
function f(a, a) {}) adalah syntax error. - Assignment ke property read-only melempar error alih-alih gagal diam-diam.
- Menghapus variabel atau fungsi biasa melempar error.
- Beberapa kata yang dicadangkan untuk masa depan (
implements,interface,package,private,protected,public,static,yield) tidak bisa dipakai sebagai nama variabel.
Tur singkatnya:
Masing-masing artinya "engine menyadari kemungkinan kesalahan lebih awal." Itulah seluruh nilai jualnya.
Bug variabel global diam-diam
Inilah alasan terbesar strict mode ada. Tanpanya, salah ketik berubah menjadi variabel global:
// Non-strict mode (don't do this)
function setup() {
usernmae = 'Ada'; // typo - creates window.usernmae
}
setup();
console.log(username); // undefined - the real variable was never set
Programnya berjalan. Tanpa error. Bug-nya baru muncul belakangan, saat sesuatu yang seharusnya membaca username mendapati undefined. Di strict mode, salah ketik yang sama langsung melempar error saat dijalankan, dan kamu memperbaikinya dalam hitungan detik, bukan jam.
JavaScript modern strict secara default
Inilah bagian yang sering mengejutkan orang: sebagian besar JavaScript yang kamu tulis sekarang sudah berada di strict mode, padahal kamu tidak mengetik 'use strict' di mana pun.
Ada dua sumber besar strict otomatis:
- ES module. File
.mjsapa pun,<script type="module">apa pun, dan apa pun yang di-import denganimport/exportberjalan di strict mode. Tidak perlu direktif. - Isi class. Setiap pernyataan di dalam
class { ... }strict, walaupun file di sekitarnya tidak.
Jadi kapan kamu benar-benar perlu menulis 'use strict'; sendiri? Hanya di classic script, yaitu JS gaya lama yang dimuat dengan tag <script> biasa, atau file Node.js lama yang memakai require tanpa bundling module. Untuk apa pun yang baru, module sudah mengerjakannya untukmu.
Strict mode mengubah this di fungsi biasa
Satu perilaku yang perlu disorot karena sering menjebak pendatang baru. Di mode non-strict, memanggil fungsi biasa tanpa object di depannya mengikat this ke object global (window di browser, global di Node). Di strict mode, ia terikat ke undefined:
Biasanya itulah yang kamu mau. Kalau this bernilai undefined, bug karena lupa mengikat method langsung terlihat. Kalau ia diam-diam menunjuk ke object global, bug-nya bersembunyi sampai sesuatu di tempat lain rusak.
Yang tidak dilakukan strict mode
Strict mode adalah pengetatan saat compile dan runtime: ia tidak memberimu tipe, tidak menangkap dereferensi null, dan tidak memperingatkan variabel yang tidak terpakai. Itu tugas TypeScript, ESLint, dan editormu. Anggap strict mode sebagai perbaikan untuk sekumpulan jebakan tertentu di tingkat bahasa, bukan jaring pengaman lengkap.
Dan ia tidak sama dengan "JavaScript modern." Kamu bisa menulis kode yang buruk di strict mode dan kode yang bagus tanpa direktif itu. Strict mode hanya membuat beberapa kesalahan tertentu lebih sulit dilakukan.
Yang perlu kamu ingat
'use strict';di bagian atas file atau fungsi mengaktifkan varian JavaScript yang lebih ketat.- Salah ketik berhenti membuat variabel global,
thisberhenti diam-diam menjadi object global, dan beberapa jebakan lain berubah menjadi error. - ES module dan isi
classotomatis strict, jadi kamu jarang perlu menulis direktifnya sendiri. - Tujuannya menangkap bug lebih awal, bukan menyalakan fitur baru.
Berikutnya: komentar
Kamu sudah melihat direktif, titik koma, dan aturan yang diperhatikan engine. Selanjutnya: catatan yang kamu tinggalkan untuk pembaca di masa depan, yaitu cara kerja komentar di JavaScript dan kapan komentar layak ditulis.
Pertanyaan yang sering diajukan
Apa itu strict mode di JavaScript?
Strict mode adalah varian JavaScript yang bisa kamu pilih untuk diaktifkan, yang mengubah sejumlah kesalahan diam-diam menjadi error sungguhan. Kamu menyalakannya dengan menaruh string 'use strict'; di bagian paling atas file atau fungsi. Ia memperketat bahasanya: assignment ke variabel yang belum dideklarasikan melempar error, nama parameter ganda dilarang, dan this di dalam pemanggilan fungsi biasa bernilai undefined, bukan object global.
Bagaimana cara mengaktifkan strict mode di JavaScript?
Tulis 'use strict'; sebagai pernyataan paling pertama di sebuah script atau fungsi. Komentar dan baris kosong boleh ada sebelumnya, tapi pernyataan lain apa pun membuatnya jadi string biasa tanpa efek. Di kode modern kamu jarang menulisnya sendiri: ES module (file .mjs atau <script type="module">) dan isi class mana pun otomatis strict.
Kenapa sebaiknya memakai strict mode di JavaScript?
Strict mode menangkap bug lebih awal. Salah ketik seperti usernmae = 'Ada' diam-diam membuat variabel global di mode non-strict; di strict mode ia melempar ReferenceError. Strict mode juga mencadangkan kata kunci untuk masa depan, melarang nama property ganda di engine lama, dan membuat this berperilaku bisa diprediksi, yang semuanya membuat kode lebih mudah dipahami.
Apakah aku butuh 'use strict' di JavaScript modern?
Biasanya tidak. ES module dan isi class strict secara default, dan sebagian besar proyek modern memakai salah satunya. Kamu hanya perlu menulis 'use strict'; secara eksplisit di classic script gaya lama, yaitu yang dimuat dengan tag <script> biasa tanpa type="module".