Pola ketat yang diperkenalkan dalam ecmascript5 memungkinkan pengembang untuk memiliki bahasa javascript yang "lebih baik" dengan memungkinkan JavaScript menjalankan lingkungan untuk menangani beberapa yang paling umum dan sulit untuk mendeteksi kesalahan dalam proses pengembangan. Untuk waktu yang lama, saya ragu tentang mode yang ketat karena hanya Firefox yang mendukung mode ketat. Tetapi hari ini, semua browser arus utama mendukung mode ketat dalam versi terbaru mereka (termasuk IE10, Opera12 dan Android 4, iOS5). Saatnya mulai menggunakan mode ketat.
Peran apa yang bisa dimainkan oleh model ketat?
Pola ketat memperkenalkan banyak perubahan pada JavaScript, dan saya membaginya menjadi dua kategori (jelas dan halus). Tujuan dari perbaikan kecil adalah untuk memperbaiki beberapa masalah terperinci dalam JavaScript saat ini, yang saya tidak akan masuk ke dalam di sini; Jika Anda tertarik, silakan baca dokumen luar biasa yang ditulis oleh Dmitry Soshnikov ECMA-262-5 dalam Detail Bab 2 Mode Ketat. Saya terutama memperkenalkan perubahan jelas yang diperkenalkan oleh mode ketat, konsep yang harus Anda ketahui sebelum Anda menggunakan mode ketat dan perubahan yang paling membantu Anda.
Sebelum Anda mulai mempelajari fitur -fitur spesifik, ingatlah bahwa salah satu tujuan utama mode ketat adalah memungkinkan Anda untuk men -debug lebih cepat dan lebih nyaman. Lebih baik untuk melempar kesalahan eksplisit ketika lingkungan runtime menemukan masalah daripada gagal diam -diam atau bertindak aneh (yang sering terjadi dengan lingkungan berjalan JavaScript yang tidak menyalakan mode ketat). Mode ketat melemparkan lebih banyak kesalahan, tetapi itu hal yang baik karena kesalahan ini akan menarik perhatian Anda dan memperbaiki banyak potensi masalah yang sebelumnya sulit dikenali.
Hapus dengan kata kunci
Pertama, pernyataan dengan dihapus dalam mode ketat, dan kode yang berisi pernyataan dengan akan melempar pengecualian dalam mode ketat. Jadi langkah pertama menggunakan mode ketat: pastikan Anda tidak menggunakan dengan kode Anda.
Salinan kode adalah sebagai berikut:
// Kode JavaScript berikut akan melempar kesalahan dalam mode ketat
dengan (lokasi) {
peringatan (href);
}
Cegah secara tak terduga menetapkan nilai ke variabel global
Kedua, variabel lokal harus dinyatakan sebelum penugasan. Sebelum mode ketat diaktifkan, variabel global dengan nama yang sama secara otomatis dibuat saat menyalin untuk variabel lokal yang tidak dideklarasikan. Ini adalah salah satu kesalahan paling umum dalam program JavaScript, dan ketika mencoba melakukan ini dalam mode ketat, pengecualian eksplisit akan dilemparkan.
Salinan kode adalah sebagai berikut:
// Pengecualian akan dilemparkan dalam mode ketat
(fungsi() {
someundecledvar = "foo";
} ());
Ini dalam fungsi tidak lagi menunjuk ke global secara default
Perubahan penting lainnya dalam mode ketat adalah bahwa fungsi ini yang tidak didefinisikan atau tidak ditentukan (nol atau tidak ditentukan) tidak menunjukkan lingkungan global secara default. Ini akan menyebabkan beberapa kesalahan eksekusi kode yang bergantung pada perilaku default ini dalam fungsi, misalnya:
Salinan kode adalah sebagai berikut:
window.color = "merah";
fungsi katacolor () {
waspada (this.color);
}
// Kesalahan akan dilaporkan dalam mode ketat. Jika tidak dalam mode ketat, itu akan meminta "merah"
SayColor ();
// Kesalahan akan dilaporkan dalam mode ketat. Jika tidak dalam mode ketat, itu akan meminta "merah"
waycolor.call (null);
Ini akan tetap tidak terdefinisi sebelum ditugaskan, yang berarti bahwa ketika konstruktor dieksekusi, pengecualian akan dilemparkan jika tidak ada kata kunci baru yang jelas sebelumnya.
Salinan kode adalah sebagai berikut:
function person (name) {
this.name = name;
}
// Akan ada kesalahan dalam mode ketat
var me = person ("nicholas");
Dalam kode di atas, karena tidak ada yang baru sebelumnya, ini dalam fungsi akan dibiarkan tidak ditentukan. Karena Anda tidak dapat mengatur properti untuk tidak terdefinisi, kode di atas akan melempar kesalahan. Dalam lingkungan mode non-ketat, ini tidak disalin ke variabel global jendela secara default, dan hasil berjalan akan secara tak terduga mengatur atribut nama untuk variabel global jendela.
Mencegah ganti nama
Saat menulis banyak kode, properti objek dan parameter fungsi mudah diatur secara tidak sengaja ke nama duplikat. Mode ketat akan secara eksplisit melempar kesalahan dalam kasus ini
Salinan kode adalah sebagai berikut:
// Nama variabel berulang akan melaporkan kesalahan dalam mode ketat
fungsi dosomething (value1, value2, value1) {
//kode
}
// Nama atribut objek kusam akan melaporkan kesalahan dalam mode ketat:
var objek = {
foo: "bar",
Foo: "Baz"
};
Kode di atas akan dianggap sebagai kesalahan sintaks dalam mode ketat dan akan memungkinkan Anda untuk mendapatkan petunjuk sebelum dieksekusi.
Eval aman ()
Meskipun pernyataan eval () tidak dihapus pada akhirnya, itu masih ditingkatkan dalam mode ketat. Perubahan terbesar adalah bahwa variabel dan deklarasi fungsi yang dieksekusi dalam eval () tidak akan secara langsung membuat variabel atau fungsi yang sesuai dalam ruang lingkup saat ini, misalnya:
Salinan kode adalah sebagai berikut:
(fungsi() {
eval ("var x = 10;");
// Dalam mode non-ketat, peringatan 10
// Dalam mode ketat, pengecualian dilemparkan karena x tidak didefinisikan.
peringatan (x);
} ());
Setiap variabel atau fungsi yang dibuat selama pelaksanaan eval () disimpan dalam eval (). Tetapi Anda dapat secara eksplisit mendapatkan hasil eksekusi di eval () dari nilai pengembalian pernyataan eval (), misalnya:
Salinan kode adalah sebagai berikut:
(fungsi() {
var result = eval ("var x = 10, y = 20; x + y");
// Pernyataan yang tersisa dapat dijalankan dengan benar dalam mode ketat atau tidak ketat. (Resulst adalah 30)
waspada (hasil);
} ());
Lemparkan pengecualian saat memodifikasi atribut read-only
Ecmascript5 juga memperkenalkan kemampuan untuk mengatur sifat spesifik suatu objek ke read-only, atau untuk membuat seluruh objek tidak dimodifikasi. Namun, dalam mode non-ketat, mencoba memodifikasi properti read-only hanya akan gagal secara diam-diam. Ini kemungkinan terjadi pada Anda selama Anda berurusan dengan beberapa API asli browser. Mode ketat akan secara eksplisit memberikan pengecualian dalam kasus ini, mengingatkan Anda bahwa memodifikasi properti ini tidak diizinkan.
Salinan kode adalah sebagai berikut:
var person = {};
Object.defineproperty (orang, "name" {
Tulisan: Salah,
Nilai: "Nicholas"
});
// Dalam mode non-ketat, keheningan gagal, dan pengecualian dilemparkan dalam mode ketat.
person.name = "John";
Dalam contoh di atas, atribut nama diatur ke read-only. Mengeksekusi modifikasi atribut nama dalam mode non-ketat tidak akan menyebabkan kesalahan, tetapi modifikasi tidak akan berhasil. Tetapi mode ketat akan dengan jelas melemparkan pengecualian.
Catatan: Sangat disarankan agar Anda mengaktifkan mode ketat saat menentukan menggunakan atribut ecmascript apa pun.
Bagaimana cara menggunakannya?
Sangat mudah untuk mengaktifkan mode ketat di browser modern, hanya perlu muncul perintah berikut dalam kode JavaScript
"Gunakan ketat";
Meskipun kode di atas tampaknya hanya string yang tidak memberikan variabel tertentu, itu sebenarnya berarti bahwa mesin JavaScript beralih ke mode ketat (browser yang tidak mendukung mode ketat akan mengabaikan kode di atas dan tidak akan memiliki dampak pada eksekusi berikutnya). Meskipun Anda dapat menerapkan instruksi ini ke fungsi global atau suatu fungsi, di sini kami harus mengingatkan Anda untuk tidak mengaktifkan mode ketat di lingkungan global.
Salinan kode adalah sebagai berikut:
// Tolong jangan gunakan seperti ini
"Gunakan ketat";
function dosomething () {
// Bagian kode ini akan berjalan dalam mode ketat
}
fungsi dosomethingelse () {
// Bagian kode ini juga akan berjalan dalam mode ketat
}
Meskipun kode di atas tampaknya bukan masalah besar. Tetapi ketika Anda tidak bertanggung jawab untuk mempertahankan semua kode yang diperkenalkan di halaman, menggunakan mode ketat dengan cara ini akan menyebabkan Anda memiliki masalah yang disebabkan oleh kode pihak ketiga yang tidak disiapkan untuk mode yang ketat.
Oleh karena itu, yang terbaik adalah menggunakan instruksi yang memungkinkan mode ketat dalam fungsi, misalnya:
Salinan kode adalah sebagai berikut:
function dosomething () {
"Gunakan ketat";
// Kode dalam fungsi ini akan berjalan dalam mode ketat
}
fungsi dosomethingelse () {
// Kode dalam fungsi ini tidak akan berjalan dalam mode ketat
}
Jika Anda ingin mode ketat diaktifkan dalam lebih dari satu fungsi, gunakan ekspresi fungsi yang diinfeksi segera (IIFE):
Salinan kode adalah sebagai berikut:
(fungsi() {
"Gunakan ketat";
function dosomething () {
// Fungsi ini berjalan dalam mode ketat
}
fungsi dosomethingelse () {
// Fungsi ini juga berjalan dalam mode ketat
}
} ());
sebagai kesimpulan
Saya sangat menyarankan agar Anda mengaktifkan mode ketat JavaScript mulai sekarang, yang dapat membantu Anda menemukan kesalahan yang belum Anda perhatikan dalam kode Anda. Jangan mengaktifkannya di lingkungan global, tetapi Anda dapat menggunakan IIFE sebanyak mungkin (segera menjalankan ekspresi fungsi) untuk menerapkan pola ketat pada beberapa fungsi. Pada awalnya, Anda akan menemukan pesan kesalahan yang belum pernah Anda temui sebelumnya, yang normal. Saat mode ketat diaktifkan, pastikan untuk mengujinya di browser yang didukung untuk menemukan masalah potensial baru. Jangan hanya menambahkan baris "Gunakan ketat" ke kode dan asumsikan bahwa kode yang tersisa akan berfungsi dengan baik. Akhirnya, mulailah menulis kode yang lebih baik dalam mode ketat.
Catatan:
Berikut adalah ringkasan dari situasi pendukung mode ketat dari masing -masing browser.
Anda dapat menguji dukungan mode ketat dari browser saat ini di halaman ini.
Keuntungan dari Mode Ketat:
Jadikan JavaScript lebih kuat
1. Ini tidak lagi dienkapsulasi, dan dalam mode normal, ini selalu menjadi objek.
2. Fun.Caller dan Fun.Arguments bukan properti yang dapat dihapus, dan tidak dapat diatur atau diambil.
3. Argumen.Caller juga merupakan atribut yang tidak dapat dihapus, juga tidak dapat diatur atau diambil.
Membuka jalan bagi versi ecmascript masa depan
1. Kata -kata yang dicadangkan berikut ditambahkan: implementasi, antarmuka, biarkan, paket, pribadi, terlindungi, publik, statis dan hasil.
2. Deklarasi metode harus ditempatkan di depan skrip atau metode, dan tidak dapat ditempatkan di tengah pernyataan seperti jika atau untuk.