Rumah  >  Artikel  >  hujung hadapan web  >  Pemahaman mendalam tentang mod ketat javascript (Mod Ketat)_kemahiran javascript

Pemahaman mendalam tentang mod ketat javascript (Mod Ketat)_kemahiran javascript

WBOY
WBOYasal
2016-05-16 16:29:521551semak imbas

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.

Salin kod Kod adalah seperti berikut:

// Kod JavaScript berikut akan membuang ralat dalam mod ketat
dengan (lokasi) {
makluman(href);
}

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.

Salin kod Kod adalah seperti berikut:

// Pengecualian akan dilemparkan dalam mod ketat
(fungsi() {
SomeUndeclaredVar = "foo";
}());

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:

Salin kod Kod adalah seperti berikut:

window.color = "merah";
fungsi sayColor() {
makluman(warna.ini);
}
// Ralat akan dilaporkan dalam mod ketat Jika tidak dalam mod ketat, "merah"
akan digesa. sayColor();
// Ralat akan dilaporkan dalam mod ketat Jika tidak dalam mod ketat, "merah"
akan digesa. sayColor.call(null);

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.

Salin kod Kod adalah seperti berikut:

fungsi Orang(nama) {
This.name = nama;
}
//Ralat akan dilaporkan dalam mod ketat
var me = Orang("Nicholas");

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

Salin kod Kod adalah seperti berikut:

//Nama pembolehubah pendua akan melaporkan ralat dalam mod ketat
fungsi doSomething(nilai1, nilai2, nilai1) {
//kod
}
//Nama atribut objek pendua akan melaporkan ralat dalam mod ketat:
objek var = {
foo: "bar",
foo: "baz"
};

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:

Salin kod Kod adalah seperti berikut:

(fungsi() {
eval("var x = 10;");
// Dalam mod tidak ketat, makluman 10
// Dalam mod ketat, pengecualian dilemparkan kerana x tidak ditakrifkan,
makluman(x);
}());

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:

Salin kod Kod adalah seperti berikut:

(fungsi() {
var result = eval("var x = 10, y = 20; x y");
//Penyataan selebihnya boleh dijalankan dengan betul dalam mod ketat atau tidak ketat (hasilnya ialah 30)
makluman(hasil);
}());

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.

Salin kod Kod adalah seperti berikut:

var orang = {};
Object.defineProperty(orang, "nama" {
boleh ditulis: palsu,
Nilai: "Nicholas"
});
// Dalam mod tidak ketat, kegagalan senyap berlaku, dalam mod ketat pengecualian dilemparkan
person.name = "John";

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.

Salin kod Kod adalah seperti berikut:

// Tolong jangan gunakannya seperti ini
"gunakan ketat";
fungsi doSomething() {
// Bahagian kod ini akan dijalankan dalam mod ketat
}
fungsi doSomethingElse() {
// Bahagian kod ini juga akan dijalankan dalam mod ketat
}


Walaupun kod di atas tidak kelihatan seperti masalah besar. Tetapi apabila anda tidak bertanggungjawab untuk mengekalkan semua kod yang diperkenalkan dalam halaman, menggunakan mod ketat dengan cara ini akan mendedahkan anda kepada masalah yang disebabkan oleh kod pihak ketiga yang tidak disediakan untuk mod ketat.

Oleh itu, sebaiknya gunakan arahan untuk mendayakan mod ketat dalam fungsi, contohnya:

Salin kod Kod adalah seperti berikut:

fungsi doSomething() {
"gunakan ketat";
//Kod dalam fungsi ini akan dijalankan dalam mod ketat
}
fungsi doSomethingElse() {
//Kod dalam fungsi ini tidak akan berjalan dalam mod ketat
}


Jika anda mahu mod ketat didayakan dalam lebih daripada satu fungsi, gunakan ungkapan fungsi yang dipanggil serta-merta (IIFE):

Salin kod Kod adalah seperti berikut:

(fungsi() {
"gunakan ketat";
Fungsi doSomething() {
               // Fungsi ini berjalan dalam mod ketat
}
Fungsi doSomethingElse() {
               // Fungsi ini juga berjalan dalam mod ketat
}
}());

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.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn