Dalam obsesi mereka untuk berbaris literal numerik, pengembang secara tidak sengaja menginisialisasi variabel b
dengan literal oktal. Mode non-ketat akan menafsirkan ini sebagai numerik literal dengan nilai 24
(dalam basis 10). Namun, mode ketat akan menimbulkan kesalahan.
Cakupan
Secara historis, JavaScript telah bingung tentang bagaimana fungsi-fungsi dilingkupi. Terkadang mereka kelihatannya memiliki cakupan yang statis, tetapi beberapa fitur membuat mereka berperilaku seperti mereka memiliki cakupan yang dinamis. Ini membingungkan, membuat program sulit dibaca dan dipahami. Kesalahpahaman menyebabkan bug. Ini juga merupakan masalah kinerja. Pelingkupan statis akan memungkinkan pengikatan variabel terjadi pada waktu kompilasi, tetapi persyaratan untuk lingkup dinamis berarti pengikatan harus ditangguhkan ke runtime, yang disertai dengan penalti kinerja yang signifikan.
Mode ketat mengharuskan semua pengikatan variabel dilakukan secara statis. Itu berarti bahwa fitur yang sebelumnya memerlukan pengikatan dinamis harus dihilangkan atau dimodifikasi. Secara khusus, pernyataan with dihilangkan, dan kemampuan fungsi eval untuk mengutak-atik lingkungan pemanggilnya sangat dibatasi.
Salah satu manfaat dari kode ketat adalah alat seperti YUI Compressor
dapat melakukan pekerjaan yang lebih baik saat memprosesnya.
Variabel Global Tersirat
JavaScript telah menyiratkan variabel global. Jika Anda tidak secara eksplisit mendeklarasikan variabel, variabel global secara implisit dideklarasikan untuk Anda. Ini membuat pemrograman lebih mudah bagi pemula karena mereka dapat mengabaikan beberapa pekerjaan rumah tangga dasar mereka. Tetapi itu membuat pengelolaan program yang lebih besar jauh lebih sulit dan secara signifikan menurunkan keandalan. Jadi dalam mode ketat, variabel global tersirat tidak lagi dibuat. Anda harus secara eksplisit mendeklarasikan semua variabel Anda.
Kebocoran Global
Ada sejumlah situasi yang dapat menyebabkan this
terikat pada objek global. Misalnya, jika Anda lupa untuk memberikan new
awalan saat memanggil fungsi konstruktor, konstruktor this
akan terikat secara tak terduga ke objek global, jadi alih-alih menginisialisasi objek baru, alih-alih akan diam-diam merusak variabel global. Dalam situasi ini, modus yang ketat akan gantinya mengikat this
untuk undefined
, yang akan menyebabkan konstruktor untuk melemparkan pengecualian sebaliknya, memungkinkan kesalahan terdeteksi lebih cepat.
Kegagalan Bising
JavaScript selalu memiliki properti hanya-baca, tetapi Anda tidak dapat membuatnya sendiri hingga Object.createProperty
fungsi ES5 mengekspos kemampuan itu. Jika Anda mencoba untuk menetapkan nilai ke properti hanya-baca, itu akan gagal diam-diam. Penugasan tidak akan mengubah nilai properti, tetapi program Anda akan melanjutkan seolah-olah itu terjadi. Ini adalah bahaya integritas yang dapat menyebabkan program masuk ke kondisi tidak konsisten. Dalam mode ketat, mencoba mengubah properti read-only akan mengeluarkan pengecualian.
Oktal
Representasi angka oktal (atau basis 8) sangat berguna ketika melakukan pemrograman tingkat mesin pada mesin yang ukuran kata-nya adalah kelipatan 3. Anda membutuhkan oktal ketika bekerja dengan mainframe CDC 6600, yang memiliki ukuran kata 60 bit. Jika Anda bisa membaca oktal, Anda bisa melihat kata sebanyak 20 digit. Dua digit mewakili kode op, dan satu digit mengidentifikasi satu dari 8 register. Selama transisi yang lambat dari kode mesin ke bahasa tingkat tinggi, dianggap berguna untuk menyediakan bentuk oktal dalam bahasa pemrograman.
Di C, representasi oktalitas yang sangat disayangkan dipilih: Leading zero. Jadi dalam C, 0100
berarti 64, bukan 100, dan 08
merupakan kesalahan, bukan 8. Bahkan lebih sayangnya, anakronisme ini telah disalin ke hampir semua bahasa modern, termasuk JavaScript, di mana ia hanya digunakan untuk membuat kesalahan. Tidak ada tujuan lain. Jadi dalam mode ketat, bentuk oktal tidak lagi diizinkan.
Dll
Argumen pseudo array menjadi sedikit lebih mirip array di ES5. Dalam mode ketat, ia kehilangan
properti callee
dan caller
propertinya. Ini memungkinkan Anda meneruskan arguments
kode yang tidak tepercaya tanpa menyerahkan banyak konteks rahasia. Juga,
arguments
properti fungsi dihilangkan.
Dalam mode ketat, duplikat kunci dalam fungsi literal akan menghasilkan kesalahan sintaksis. Fungsi tidak dapat memiliki dua parameter dengan nama yang sama. Fungsi tidak dapat memiliki variabel dengan nama yang sama dengan salah satu parameternya. Suatu fungsi tidak dapat delete
variabelnya sendiri. Upaya ke
delete
properti yang tidak dapat dikonfigurasi sekarang melempar pengecualian. Nilai-nilai primitif tidak dibungkus secara implisit.
ECMAScript 5 menambahkan daftar kata-kata yang dipesan. Jika Anda menggunakannya sebagai variabel atau argumen, mode ketat akan menimbulkan kesalahan. Kata-kata yang dicadangkan adalah: