"Mode ketat" adalah sintaks baru yang didefinisikan dalam ECMA-262 Edition 5, menunjukkan bahwa itu perlu dieksekusi menggunakan sintaks JavaScript yang ketat. Beberapa metode penulisan bekas di masa lalu akan melempar pengecualian sintakser, seperti:
1. Tidak ada Deklarasi Var sebelum variabel
2. Gunakan sintaks oktal: var n = 023 dan var s = "/047"
3. Gunakan dengan pernyataan
4. Gunakan Hapus untuk menghapus nama variabel (bukan nama atribut): hapus myvariable
5. Gunakan eval atau argumen sebagai nama variabel atau nama fungsi
6. Gunakan kata -kata yang dipesan di masa depan (mungkin digunakan dalam ecmascript 6): implement, antarmuka, membiarkan, paket, pribadi, terlindungi, publik, statis, dan menghasilkan nama variabel atau nama fungsi
7. Gunakan Deklarasi Fungsi di Blok Pernyataan: if (a <b) {function f () {}}
8. Kesalahan lainnya
8.1. Gunakan dua nama atribut identik dalam ukuran sub-wajah objek: {a: 1, b: 3, a: 7}
8.2. Gunakan dua nama parameter identik dalam parameter fungsi: fungsi f (a, b, b) {}
Ini dijelaskan secara rinci di bawah ini.
1. Mengapa menggunakan "mode ketat"
Tujuan membangun "model ketat" terutama sebagai berikut:
1. Menghilangkan beberapa aspek sintaks JavaScript yang tidak masuk akal dan tidak sempurna dan mengurangi beberapa perilaku aneh;
2. Hilangkan beberapa rasa tidak aman dalam kode yang berjalan dan memastikan keamanan kode yang berjalan;
3. Meningkatkan efisiensi kompiler dan meningkatkan kecepatan operasi;
4. Letakkan fondasi untuk versi baru JavaScript di masa depan.
"Mode ketat" mencerminkan arah pengembangan JavaScript yang lebih masuk akal, lebih aman, dan lebih ketat. Browser arus utama termasuk IE 10 telah mendukungnya, dan banyak proyek besar telah mulai merangkulnya secara penuh.
Di sisi lain, kode yang sama mungkin memiliki hasil berjalan yang berbeda dalam "mode ketat"; Beberapa pernyataan yang dapat dijalankan dalam "Mode Normal" tidak akan dijalankan dalam "Mode Ketat". Menguasai konten ini akan membantu Anda memahami JavaScript lebih hati-hati dan mendalam, menjadikan Anda programmer yang lebih baik.
Artikel ini akan memberikan pengantar terperinci untuk "model ketat".
2. Deklarasikan "mode ketat"
Mendeklarasikan "mode ketat" sederhana dan hanya memiliki satu pernyataan:
Salinan kode adalah sebagai berikut: "Gunakan ketat";
Catatan: Browser yang lebih tua akan memperlakukannya sebagai string normal dan mengabaikannya.
3. Deklarasikan lokasi dan hubungan kontekstual "mode ketat"
"Mode ketat" terutama mempengaruhi ruang lingkup tempat ia berada. Jika digunakan dalam fungsi, itu tidak akan mengubah ruang lingkup global dan fungsi -fungsi lain yang tidak digunakan lainnya menjadi "mode ketat". Artinya, ruang lingkup deklarasi pola yang ketat tergantung pada konteksnya. Jika mode ketat dinyatakan dalam konteks global (di luar ruang lingkup suatu fungsi), semua kode dalam program dalam mode ketat. Jika pola ketat dinyatakan dalam suatu fungsi, semua kode dalam fungsi dalam pola yang ketat. Misalnya, dalam contoh berikut, semua kode dalam mode ketat, dan deklarasi variabel di luar fungsi akan menyebabkan kesalahan sintaks: "Variabel tidak didefinisikan dalam mode ketat". Ada dua cara untuk menyebut "mode ketat" dan cocok untuk kesempatan yang berbeda.
1. untuk seluruh file skrip
Masukkan "Gunakan ketat" di baris pertama file skrip dan seluruh skrip akan berjalan dalam "mode ketat". Jika pernyataan baris ini tidak pada baris pertama, itu tidak valid dan seluruh skrip berjalan dalam "mode normal". Ini membutuhkan perhatian khusus jika file kode dari berbagai mode digabungkan menjadi satu file.
;
Salinan kode adalah sebagai berikut:
<script>
"Gunakan ketat";
console.log ("Ini mode ketat.");
</script>
<script>
console.log ("Ini mode normal.");
</script>
Kode di atas menunjukkan bahwa ada dua potong kode JavaScript di halaman web secara bergantian. Tag skrip sebelumnya adalah mode yang ketat, yang terakhir tidak.
2. Untuk satu fungsi
Masukkan "Gunakan ketat" di baris pertama dari tubuh fungsi, dan seluruh fungsi berjalan dalam "mode ketat".
Salinan kode adalah sebagai berikut:
fungsi strict () {
"Gunakan ketat";
kembalikan "Ini adalah pola yang ketat.";
}
fungsi notstrict () {
kembalikan "ini mode normal.";
}
3. Penanganan Solusi untuk File Script
Karena metode panggilan pertama tidak kondusif untuk penggabungan file, lebih baik meminjam metode kedua dan menempatkan seluruh file skrip dalam fungsi anonim yang dieksekusi segera.
Salinan kode adalah sebagai berikut:
(fungsi (){
"Gunakan ketat";
// beberapa kode di sini
}) ();
4. Sintaks dan Perilaku Perubahan Di Bawah "Mode Ketat"
"Mode ketat" telah membuat beberapa perubahan pada sintaks dan perilaku JavaScript.
1. Deklarasi Eksplisit Variabel Global
Dalam mode normal, saat menggunakan variabel, kita tidak harus menggunakan VAR untuk menyatakan (secara eksplisit menyatakan), tetapi dalam mode yang ketat, kita harus menggunakan VAR untuk menyatakan sebelum menggunakan variabel, jika tidak kesalahan akan terjadi.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
v = 1; // kesalahan dilaporkan, V tidak dinyatakan
untuk (i = 0; i <2; i ++) {// kesalahan dilaporkan, saya tidak dinyatakan
}
Oleh karena itu, dalam mode ketat, variabel harus dinyatakan dengan perintah VAR sebelum digunakan.
2. Ikatan statis
Fitur dari bahasa JavaScript adalah bahwa ia memungkinkan "pengikatan dinamis", yaitu, yang dimiliki oleh properti dan metode tertentu, tidak ditentukan pada waktu kompilasi, tetapi saat runtime.
Mode ketat menempatkan beberapa batasan pada pengikatan dinamis. Dalam beberapa kasus, hanya pengikatan statis yang diizinkan. Dengan kata lain, objek atribut dan metode yang dimiliki ditentukan selama tahap kompilasi. Ini akan membantu meningkatkan efisiensi kompilasi, membuat kode lebih mudah dibaca dan lebih sedikit kecelakaan.
Secara khusus, aspek -aspek berikut terlibat.
(1) Penggunaan dengan pernyataan dilarang
Karena pernyataan dengan tidak dapat ditentukan pada waktu kompilasi, objek atribut yang dimiliki.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
var v = 1;
dengan (o) {// kesalahan sintaksis
v = 2;
}
(2) Buat ruang lingkup evaluasi
Dalam mode normal, bahasa JavaScript memiliki dua lingkup variabel: ruang lingkup global dan ruang lingkup fungsi. Mode ketat menciptakan ruang lingkup ketiga: ruang lingkup evaluasi.
Dalam mode normal, ruang lingkup pernyataan eval tergantung pada apakah itu dalam ruang lingkup global atau dalam ruang lingkup fungsional. Dalam mode yang ketat, pernyataan eval itu sendiri adalah ruang lingkup dan tidak dapat lagi menghasilkan variabel global. Variabel yang dihasilkannya hanya dapat digunakan di dalam eval.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
var x = 2;
console.info (eval ("var x = 5; x")); // 5
console.info (x); // 2
3. Langkah -langkah keamanan yang ditingkatkan
(1) melarang kata kunci ini untuk menunjuk ke objek global
Salinan kode adalah sebagai berikut:
fungsi f () {
kembali! Ini;
}
// Kembalikan false, karena "ini" menunjuk ke objek global, "! Ini" adalah salah
fungsi f () {
"Gunakan ketat";
kembali! Ini;
}
// Kembalikan benar, karena dalam mode yang ketat, nilai ini tidak ditentukan, jadi "! Ini" benar.
Oleh karena itu, saat menggunakan konstruktor, jika Anda lupa menambahkan yang baru, ini tidak lagi menunjuk pada objek global, tetapi melaporkan kesalahan.
Salinan kode adalah sebagai berikut:
fungsi f () {
"Gunakan ketat";
this.a = 1;
};
f (); // kesalahan, ini tidak didefinisikan
Dalam fungsi biasa panggilan f (), nilai ini akan menunjuk ke objek global. Dalam mode yang ketat, nilai ini akan ditunjuk untuk tidak ditentukan. Ketika fungsi dipanggil melalui panggilan dan berlaku, jika parameter nilai ini lulus adalah nilai primitif (string, angka, nilai boolean) kecuali untuk nol dan tidak ditentukan, maka nilai ini akan menjadi objek pembungkus yang sesuai dengan nilai asli. Jika nilai parameter nilai ini tidak terdefinisi atau nol, nilai ini akan menunjuk ke objek global. Dalam mode ketat, nilai nilai ini adalah nilai parameter nilai ini, tanpa konversi jenis apa pun.
(2) dilarang melintasi tumpukan panggilan di dalam fungsi
Salinan kode adalah sebagai berikut:
fungsi f1 () {
"Gunakan ketat";
f1.caller; // Laporkan kesalahan
f1.arguments; // Laporkan kesalahan
}
f1 ();
4. Nonaktifkan penghapusan variabel
Variabel tidak dapat dihapus dalam mode ketat. Hanya properti objek yang dapat dikonfigurasi yang diatur ke True dapat dihapus.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
var x;
hapus x; // Kesalahan sintaksis
var o = object.create (null, 'x', {
Nilai: 1,
dapat dikonfigurasi: Benar
});
hapus sapi; // Hapus dengan sukses
5. Kesalahan eksplisit
Dalam mode normal, jika Anda menetapkan properti read-only suatu objek, tidak akan ada kesalahan, dan itu hanya akan gagal secara diam-diam. Dalam mode ketat, kesalahan akan dilaporkan.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
var o = {};
Object.defineproperty (o, "v", {value: 1, writable: false});
OV = 2; // Laporkan kesalahan
Dalam mode yang ketat, jika Anda menetapkan properti, baca menggunakan metode Getter, kesalahan akan dilaporkan.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
var o = {
get v () {return 1; }
};
OV = 2; // Laporkan kesalahan
Dalam mode ketat, menambahkan atribut baru ke objek yang dilarang diperpanjang akan menghasilkan kesalahan.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
var o = {};
Object.preventextensions (o);
ov = 1; // Laporkan kesalahan
Dalam mode yang ketat, menghapus properti yang tidak diatasi akan menyebabkan kesalahan.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
hapus objek.prototype; // Laporkan kesalahan
6. Ganti nama kesalahan
Mode ketat telah menambahkan beberapa kesalahan sintaksis.
(1) Objek tidak dapat memiliki atribut dengan nama duplikat
Dalam mode normal, jika objek memiliki beberapa atribut duplikat, atribut yang ditetapkan terakhir akan mengesampingkan nilai sebelumnya. Dalam mode ketat, ini adalah kesalahan sintaksis.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
var o = {
P: 1,
P: 2
}; // Kesalahan sintaksis
(2) Fungsi tidak dapat memiliki parameter dengan nama duplikat
Dalam mode normal, jika fungsi memiliki beberapa parameter dengan nama duplikat, dapat dibaca dengan argumen [i]. Dalam mode ketat, ini adalah kesalahan sintaksis.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
fungsi f (a, a, b) {// kesalahan sintaksis
kembali ;
}
7. Notasi oktal dilarang
Dalam mode normal, jika bit pertama dari integer adalah 0, itu berarti bahwa ini adalah angka oktal, seperti 0100 sama dengan 64 dalam desimal. Mode ketat melarang representasi ini. Jika bit pertama bilangan bulat adalah 0, kesalahan akan dilaporkan.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
var n = 0100; // Kesalahan sintaksis
8. Pembatasan objek argumen
Argumen adalah objek parameter fungsi, dan mode ketat membatasi penggunaannya.
(1) Menetapkan argumen tidak diperbolehkan
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
argumen ++; // Kesalahan sintaksis
var obj = {set p (argumen) {}}; // Kesalahan sintaksis
coba {} catch (argumen) {} // kesalahan sintaksis
argumen fungsi () {} // kesalahan sintaksis
var f = fungsi baru ("argumen", "'gunakan ketat'; return 17;"); // Kesalahan sintaksis
(2) Argumen tidak lagi melacak perubahan parameter
Salinan kode adalah sebagai berikut:
fungsi f (a) {
a = 2;
return [a, argumen [0]];
}
f (1); // Mode normal adalah [2,2]
fungsi f (a) {
"Gunakan ketat";
a = 2;
return [a, argumen [0]];
}
f (1); // Mode ketat adalah [2,1]
(3) penggunaan argumen. Callee dilarang
Ini berarti Anda tidak dapat menyebut diri Anda di dalam fungsi anonim.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
var f = function () {return arguments.callee; };
F(); // Laporkan kesalahan
9. Fungsi harus dinyatakan di level atas
Di masa depan, versi baru JavaScript akan memperkenalkan "ruang lingkup level blok". Untuk menyelaraskan dengan versi baru, mode ketat hanya memungkinkan fungsi untuk dinyatakan di tingkat atas ruang lingkup global atau ruang lingkup fungsi. Artinya, tidak diizinkan untuk mendeklarasikan fungsi dalam blok kode non-fungsi.
Salinan kode adalah sebagai berikut:
"Gunakan ketat";
if (true) {
fungsi f () {} // kesalahan sintaksis
}
untuk (var i = 0; i <5; i ++) {
fungsi f2 () {} // kesalahan sintaksis
}
10. Simpan kata -kata
Untuk beralih ke versi baru JavaScript di masa depan, beberapa kata yang dipesan telah ditambahkan ke mode ketat: implementasi, antarmuka, biarkan, paket, pribadi, terlindungi, publik, statis, hasil.
Menggunakan kata -kata ini sebagai nama variabel akan menghasilkan kesalahan.
Salinan kode adalah sebagai berikut:
Paket Fungsi (Dilindungi) {// Kesalahan Sintaksis
"Gunakan ketat";
VAR IMPLEMENSI; // Kesalahan sintaksis
}
Selain itu, versi kelima dari ecmascript juga menetapkan kata -kata yang dipesan lainnya (kelas, enum, ekspor, memperluas, impor, super), serta kata -kata cadangan yang ditambahkan oleh browser utama, yang tidak dapat digunakan sebagai nama variabel.