Mod ketat yang diperkenalkan dalam ECMAScript5 membolehkan pembangun mempunyai bahasa JavaScript yang "lebih baik" dengan membenarkan persekitaran masa jalan JavaScript mengendalikan beberapa ralat yang paling biasa dan sukar ditemui dalam proses pembangunan secara berbeza daripada sekarang. Untuk masa yang lama, saya ragu-ragu tentang mod ketat kerana hanya Firefox yang menyokongnya. Tetapi hari ini, semua penyemak imbas utama telah menyokong mod ketat dalam versi terkini mereka (termasuk IE10, Opera12 dan Android4, IOS5).
Apakah peranan yang dimainkan oleh mod ketat?
Mod ketat memperkenalkan banyak perubahan pada JavaScript, dan saya membahagikannya kepada dua kategori (jelas dan halus). Matlamat penambahbaikan kecil adalah untuk menyelesaikan beberapa masalah terperinci dalam JavaScript semasa, yang saya tidak akan membincangkan secara mendalam di sini jika anda berminat, sila baca dokumen yang sangat baik ECMA-262-5 dalam Butiran Bab 2 Mod Ketat oleh Dmitry Soshnikov; . Saya akan menumpukan di sini pada perubahan jelas yang diperkenalkan oleh mod ketat, konsep yang anda perlu tahu sebelum menggunakan mod ketat, dan perubahan yang paling membantu anda.
Sebelum anda mula mempelajari ciri khusus, sila ingat bahawa salah satu matlamat mod ketat adalah untuk membolehkan anda nyahpepijat dengan lebih pantas dan lebih mudah. Adalah lebih baik bagi masa jalan untuk secara eksplisit membuang ralat apabila ia mengesan masalah daripada gagal secara senyap atau berkelakuan pelik (seperti yang sering berlaku dengan masa jalan JavaScript yang tidak mendayakan mod ketat). Mod ketat akan menimbulkan lebih banyak ralat, tetapi itu adalah perkara yang baik kerana ralat ini akan menarik perhatian anda dan membetulkan banyak kemungkinan masalah yang sebelum ini sukar dicari.
Alih keluar DENGAN kata kunci
Pertama sekali, pernyataan dengan dialih keluar daripada mod ketat Kod yang mengandungi pernyataan dengan akan membuang pengecualian dalam mod ketat. Jadi langkah pertama untuk menggunakan mod ketat: Pastikan anda tidak menggunakan dalam kod anda.
Halang penetapan pembolehubah global secara tidak sengaja
Kedua, pembolehubah tempatan mesti diisytiharkan sebelum memberikan nilai. Sebelum mod ketat didayakan, menyalin pembolehubah tempatan yang tidak diisytiharkan secara automatik akan mencipta pembolehubah global dengan nama yang sama. Ini adalah salah satu ralat yang paling biasa dalam program JavaScript, dan pengecualian eksplisit akan dilemparkan apabila cuba melakukan ini dalam mod yang ketat.
INI dalam fungsi tidak lagi menunjuk ke global secara lalai
Satu lagi perubahan penting dalam mod ketat ialah ini dalam fungsi yang tidak ditentukan atau kosong (null atau undefined) tidak lagi menghala ke persekitaran global (global) secara lalai. Ini akan menyebabkan ralat dalam pelaksanaan beberapa kod yang bergantung pada tingkah laku lalai ini dalam fungsi, seperti:
ini akan kekal tidak ditentukan sehingga ia ditetapkan, yang bermaksud bahawa apabila pembina dilaksanakan, jika tiada kata kunci baharu yang jelas sebelum ini, pengecualian akan dilemparkan.
Dalam kod di atas, apabila pembina Orang dijalankan, kerana tiada yang baharu sebelum ini, fungsi ini akan kekal tidak ditentukan Memandangkan anda tidak boleh menetapkan sifat untuk tidak ditentukan, kod di atas akan menimbulkan ralat. Dalam persekitaran mod tidak ketat, ini yang tidak disalin akan menghala ke pembolehubah global tetingkap secara lalai, dan hasil operasi adalah untuk menetapkan atribut nama untuk pembolehubah global tetingkap secara tidak sengaja.
Halang nama pendua
Apabila menulis banyak kod, mudah untuk menetapkan sifat objek dan parameter fungsi secara tidak sengaja kepada nama pendua. Mod ketat akan menimbulkan ralat secara eksplisit dalam kes ini
Kod di atas akan dianggap sebagai ralat sintaks dalam mod ketat dan anda akan digesa sebelum pelaksanaan.
EVAL() Selamat
Walaupun kenyataan eval() tidak dialih keluar akhirnya, beberapa penambahbaikan masih dilakukan padanya dalam mod ketat. Perubahan terbesar ialah pengisytiharan pembolehubah dan fungsi yang dilaksanakan dalam eval() tidak akan terus mencipta pembolehubah atau fungsi yang sepadan dalam skop semasa, contohnya:
Sebarang pembolehubah atau fungsi yang dicipta semasa pelaksanaan eval() dikekalkan dalam eval(). Tetapi anda boleh mendapatkan hasil pelaksanaan dengan jelas dalam eval() daripada nilai pulangan pernyataan eval(), sebagai contoh:
Pengecualian dilemparkan apabila mengubah suai sifat baca sahaja
ECMAScript5 juga memperkenalkan keupayaan untuk menetapkan sifat khusus objek sebagai baca sahaja, atau untuk menjadikan keseluruhan objek tidak boleh diubah suai. Tetapi dalam mod tidak ketat, cuba mengubah suai sifat baca sahaja akan gagal secara senyap. Anda mungkin akan menghadapi situasi ini apabila anda berurusan dengan beberapa API asli pelayar. Mod ketat akan secara eksplisit membuang pengecualian dalam kes ini untuk mengingatkan anda bahawa mengubah suai sifat ini tidak dibenarkan.
Dalam contoh di atas, atribut nama ditetapkan kepada baca sahaja Mengubah suai atribut nama dalam mod tidak ketat tidak akan menyebabkan ralat, tetapi pengubahsuaian tidak akan berjaya. Tetapi mod ketat akan secara eksplisit membuang pengecualian.
NOTA: Anda amat disyorkan agar mendayakan mod ketat apabila menggunakan sebarang spesifikasi atribut sifat ECMAScript.
Bagaimana untuk menggunakan?
Sangat mudah untuk menghidupkan mod ketat dalam penyemak imbas moden, hanya masukkan arahan berikut dalam kod JavaScript
"gunakan ketat";
Walaupun nampaknya kod di atas hanyalah rentetan yang tidak diberikan kepada pembolehubah, ia sebenarnya mengarahkan enjin JavaScript untuk beralih ke mod ketat (pelayar yang tidak menyokong mod ketat akan mengabaikan kod di atas dan tidak akan kesan ke atas pelaksanaan seterusnya). Walaupun anda boleh menggunakan arahan ini secara global atau dalam fungsi tertentu, anda masih perlu diingatkan untuk tidak mendayakan mod ketat dalam persekitaran global.
Oleh itu, sebaiknya gunakan arahan untuk mendayakan mod ketat dalam fungsi, contohnya:
Kesimpulan
Saya amat mengesyorkan agar anda mendayakan mod ketat JavaScript mulai sekarang, ia boleh membantu anda mencari ralat yang tidak disedari dalam kod anda. Jangan dayakannya secara global, tetapi anda boleh menggunakan IIFE (pelaksanaan segera ekspresi fungsi) sebanyak mungkin untuk menggunakan mod ketat pada berbilang skop fungsi. Pada mulanya, anda akan menemui mesej ralat yang tidak pernah anda temui sebelum ini. Apabila mendayakan mod ketat, pastikan anda menguji dalam penyemak imbas yang disokong untuk mengenal pasti isu berpotensi baharu. Jangan hanya menambah baris "gunakan ketat" pada kod anda dan anggap kod yang lain akan berfungsi. Akhir sekali, sila mula menulis kod yang lebih baik dalam mod ketat.
Nota:
Berikut ialah ringkasan sokongan mod ketat dalam pelbagai pelayar.
Anda boleh menguji sokongan mod ketat penyemak imbas semasa pada halaman ini.
Kelebihan mod ketat:
Jadikan JavaScript lebih kuat
1. Ini tidak lagi dikapsulkan Dalam mod biasa, ini sentiasa menjadi objek.
2. Fun.caller dan fun.arguments bukanlah atribut yang boleh dipadamkan, dan juga tidak boleh ditetapkan atau diambil semula.
3. Arguments.caller juga merupakan atribut yang tidak boleh dipadamkan, juga tidak boleh ditetapkan atau diambil semula.
Merintis jalan untuk versi ECMAScript akan datang
1. Perkataan terpelihara berikut telah ditambah: implements, interface, let, package, private, protected, public, static dan yield.
2. Pengisytiharan kaedah hendaklah diletakkan di hadapan skrip atau kaedah, dan tidak boleh diletakkan di tengah-tengah pernyataan seperti jika atau untuk.