Mode ketat adalah fitur baru dari ecmascript 5. Ini memungkinkan Anda untuk menempatkan seluruh program, atau fungsi, dalam konteks operasi "ketat". Konteks ketat ini mencegah operasi tertentu dan melempar lebih banyak pengecualian.
Sementara Ecmascript 5 kompatibel dengan ecmascript 3, dalam mode ketat, semua fitur yang tidak disukai dalam ecmascript 3 dinonaktifkan (atau dilemparkan kesalahan) daripada kompatibel.
Aktifkan mode ketat memiliki manfaat berikut:
1. Tangkap beberapa kesalahan pemrograman dan lemparkan pengecualian.
2. Cegah beberapa operasi yang relatif "tidak aman" (seperti mengakses variabel global) agar tidak dilakukan dan pengecualian dilemparkan.
3. Nonaktifkan beberapa fitur yang membingungkan.
Sebagian besar informasi tentang mode ketat dapat ditemukan di halaman 223 dari kode ES5 [PDF].
(Catatan: Mode ketat Ecmascript 5 berbeda dari mode Firefox yang ketat)
Cara mengaktifkan mode ketat
Tambahkan pernyataan ini di awal program untuk mengaktifkan mode ketat untuk seluruh skrip:
Salinan kode adalah sebagai berikut:
'Gunakan ketat';
Anda juga dapat mengaktifkan mode ketat hanya di dalam fungsi, sehingga tidak akan mempengaruhi bagian luar:
Salinan kode adalah sebagai berikut:
fungsi imstrict () {
'Gunakan ketat';
// ... kode Anda ...
}
Pernyataan yang memungkinkan mode ketat hanyalah string normal "Gunakan ketat", tanpa sintaks baru. Ini berarti tidak akan ada dampak negatif pada browser lama.
Salah satu aplikasi praktis yang mengaktifkan mode ketat di dalam suatu fungsi adalah untuk menentukan seluruh perpustakaan kelas JavaScript di dalam fungsi mode yang ketat, sehingga tidak mempengaruhi kode eksternal:
Salinan kode adalah sebagai berikut:
// Kode Non-Strict ...
(fungsi(){
"Gunakan ketat";
// Tentukan perpustakaan Anda dengan ketat ...
}) ();
// Kode Non-Strict ...
Jadi, perubahan apa yang telah dibuat dalam skrip dalam mode ketat?
Variabel dan Properti
Menetapkan variabel yang tidak ditentukan akan gagal alih -alih menggunakan variabel ini sebagai variabel global.
Menulis properti dengan properti yang dapat ditulis salah, menghapus properti dengan properti yang dapat dikonfigurasi dengan false, atau menambahkan properti dengan properti yang dapat diperluas dengan false, akan menghasilkan kesalahan (karakteristik ini sudah disetujui). Di masa lalu, operasi ini tidak memberikan pengecualian, tetapi hanya gagal diam -diam.
Melakukan operasi penghapusan pada variabel, fungsi, atau parameter fungsi akan menyebabkan kesalahan.
Salinan kode adalah sebagai berikut:
var foo = 'test';
function test () {}
hapus foo; // kesalahan
Hapus tes; // kesalahan
function test2 (arg) {
Hapus arg; // kesalahan
}
Mendefinisikan properti yang sama di dalam wadah objek akan menyebabkan pengecualian dilemparkan:
Salinan kode adalah sebagai berikut:
// kesalahan
{foo: true, foo: false}
evaluasi
Setiap penggunaan nama "eval" (tujuan utamanya adalah untuk mengarahkan fungsi eval ke variabel atau properti objek) dilarang.
Salinan kode adalah sebagai berikut:
// semua menghasilkan kesalahan ...
obj.eval = ...
obj.foo = eval;
var eval = ...;
untuk (var eval in ...) {}
function eval () {}
tes fungsi (eval) {}
function (eval) {}
fungsi baru ("eval")
Selain itu, mendeklarasikan variabel baru melalui eval juga akan tidak valid:
Salinan kode adalah sebagai berikut:
eval ("var a = false;");
cetak (typeof a); // belum diartikan
fungsi
Penulisan ulang objek argumen akan menyebabkan kesalahan:
Salinan kode adalah sebagai berikut:
argumen = [...]; // tidak diizinkan
Parameter dengan nama yang sama akan menyebabkan kesalahan:
Salinan kode adalah sebagai berikut:
(function (foo, foo) {}) // error
Akses ke argumen. Oleh karena itu, setiap fungsi anonim yang perlu digunakan harus dinamai terlebih dahulu, misalnya:
Salinan kode adalah sebagai berikut:
setTimeout (function later () {
// lakukan hal -hal ...
setTimeout (nanti, 1000);
}, 1000);
Argumen, penelepon dan sifat callee dari fungsi tidak ada lagi, dan operasi untuk mendefinisikannya juga dilarang.
Salinan kode adalah sebagai berikut:
function test () {}
test.caller = 'penelepon'; // kesalahan
Akhirnya, bug lama (dan sangat menjengkelkan) telah diselesaikan: ketika nol atau tidak terdefinisi digunakan sebagai parameter pertama dari fungsi.prototype.call atau function.prototype.Apply Metode, ini di dalam fungsi akan menunjuk ke objek global. Dan mode ketat akan mencegah eksekusi dan melempar pengecualian:
Salinan kode adalah sebagai berikut:
(function () {...}). Call (null); // Pengecualian
dengan() { }
Pernyataan dengan () {} benar -benar tergantung dalam mode ketat.