Kata -kata sebelumnya
Penanganan kesalahan sangat penting untuk pengembangan aplikasi web. Itu tidak dapat memprediksi kemungkinan kesalahan di muka, dan strategi pemulihan tidak dapat diadopsi terlebih dahulu, yang dapat menyebabkan pengalaman pengguna yang buruk. Karena kesalahan JavaScript dapat menyebabkan halaman web tidak dapat digunakan, sebagai pengembang, Anda harus tahu kapan, mengapa, dan apa yang akan terjadi. Artikel ini akan memperkenalkan mekanisme penanganan kesalahan dalam JavaScript secara rinci
objek kesalahan
Objek kesalahan adalah objek yang berisi informasi kesalahan dan merupakan objek asli JavaScript. Ketika kesalahan terjadi selama kode penguraian atau berjalan, mesin JavaScript akan secara otomatis menghasilkan dan melempar instance dari objek kesalahan, dan kemudian seluruh program akan terganggu di mana kesalahan terjadi.
Console.log (t); // ReferenceError Uncaught: T tidak didefinisikan
ECMA-262 menentukan bahwa objek kesalahan mencakup dua properti: pesan dan nama. Atribut pesan menyimpan pesan kesalahan, sedangkan atribut nama menyimpan jenis kesalahan
Salinan kode adalah sebagai berikut:
// Secara umum, gunakan pernyataan try-catch untuk menangkap kesalahan
mencoba{
T;
} catch (ex) {
console.log (ex.message); // t tidak didefinisikan
console.log (ex.name); // ReferenceError
}
Browser juga memperluas properti objek kesalahan dan menambahkan informasi lain yang relevan. Di antara mereka, yang paling banyak diterapkan oleh produsen browser adalah atribut tumpukan, yang menunjukkan informasi jejak tumpukan (Safari tidak mendukungnya)
Salinan kode adalah sebagai berikut:
mencoba{
T;
} catch (ex) {
console.log (ex.stack); //@file: /// d: /wamp/www/form.html: 12: 2
}
Tentu saja, Anda dapat menggunakan konstruktor kesalahan () untuk membuat objek kesalahan. Jika parameter pesan ditentukan, objek kesalahan akan menggunakannya sebagai properti pesannya; Jika tidak ditentukan, itu akan menggunakan string default yang telah ditentukan sebagai nilai properti
Salinan kode adalah sebagai berikut:
kesalahan baru ();
kesalahan baru (pesan);
// Umumnya, gunakan pernyataan lemparan untuk melempar kesalahan
lempar kesalahan baru ('tes'); // kesalahan tanpa batas: tes
lempar kesalahan baru (); // kesalahan yang tidak dibawa
Salinan kode adalah sebagai berikut:
function usereRror (pesan) {
this.message = pesan;
this.name = "usereRror";
}
UsereRror.prototype = new error ();
UsereRror.prototype.constructor = UserError;
Lempar pengguna baru ("errorMessage"); // Usererror yang Tak Terbang: ErrorMessage
Ketika konstruktor kesalahan () dipanggil secara langsung seperti fungsi tanpa menggunakan operator baru, perilakunya sama seperti ketika operator baru dipanggil
Salinan kode adalah sebagai berikut:
Kesalahan();
Kesalahan (pesan);
Throw Error ('Test'); // Kesalahan Tak Terbang: Tes
Throw error (); // kesalahan yang tidak dibawa
Objek kesalahan memiliki metode tostring (), yang mengembalikan atribut pesan dari objek kesalahan.
Salinan kode adalah sebagai berikut:
var test = kesalahan baru ('teserror');
console.log (test.tostring ()); // 'error: testerror'
tipe kesalahan
Ada banyak jenis kesalahan yang mungkin terjadi selama eksekusi kode. Setiap kesalahan memiliki jenis kesalahan yang sesuai, dan ketika kesalahan terjadi, objek kesalahan dari jenis yang sesuai akan dilemparkan. ECMA-262 mendefinisikan 7 jenis kesalahan berikut:
Salinan kode adalah sebagai berikut:
Kesalahan
Evalerror (Eval ERROR)
RangeError (RangeError)
ReferenceError (kesalahan referensi)
Sintakser (kesalahan sintaks)
TypeError (jenis kesalahan)
Urierror (kesalahan URI)
Di mana, kesalahan adalah tipe dasar, dan tipe kesalahan lainnya diwarisi dari jenis ini. Oleh karena itu, semua jenis kesalahan berbagi satu set properti yang sama. Kesalahan tipe kesalahan jarang terjadi, dan jika ada, mereka juga dilemparkan oleh browser; Tujuan utama dari jenis dasar ini adalah agar pengembang melempar kesalahan khusus
【Evalerror (eval error)】
Ketika fungsi eval tidak dieksekusi dengan benar, kesalahan evaluasi akan dilemparkan. Jenis kesalahan ini tidak lagi muncul di ES5, tetapi akan terus dipertahankan untuk memastikan kompatibilitas dengan kode sebelumnya.
【RangeError (RangeError)】
Kesalahan jenis rangeError akan dipicu ketika nilai melebihi kisaran yang sesuai, terutama termasuk melebihi kisaran panjang array dan melebihi rentang nilai angka.
Salinan kode adalah sebagai berikut:
Array Baru (-1); // RangeRror Uncaught: Panjang Array Tidak Valid
Array Baru (Number.Max_Value); // RangeRror Uncaught: Panjang Array Tidak Valid
(1234) .to exponential (21); // Argumen Uncaught Unsaught: Toexponential () Argumen harus antara 0 dan 20
(1234) .toExponential (-1); //// RangeRror Uncaught: Toexponential () Argumen harus antara 0 dan 20
【ReferenceError (Kesalahan referensi)】
ReferenceError akan dipicu saat mengacu pada kesalahan variabel atau tipe lvalue yang tidak ada.
a; // ReferenceError yang tidak dibawa: A tidak didefinisikan
1 ++; // ReferenceError Unlught: Ekspresi sisi kiri tidak valid dalam operasi postfix
【Sintakserror (SyntaxError)】
Ketika aturan sintaks tidak terpenuhi, sintakser akan dilemparkan (kesalahan sintaksis)
Salinan kode adalah sebagai berikut:
// Nama variabelnya salah
Var 1a; // Sintakserror Tak Terbaik: Angka Tak Terduga
// Kurung yang hilang
Console.log 'Hello'); // Sintakser Tanpa Diputus: String Tidak Terduga
【TypeError (jenis kesalahan)】
TipeError Tipe Error akan disebabkan ketika tipe tak terduga disimpan dalam variabel, atau saat mengakses metode yang tidak ada. Meskipun penyebab kesalahan beragam, pada akhirnya, itu karena jenis variabel tidak memenuhi persyaratan saat melakukan jenis operasi tertentu.
Salinan kode adalah sebagai berikut:
var o = baru 10; // Typeerror Uncaught: 10 bukan konstruktor
alert ('name' in true); // typeError Uncaught: tidak dapat menggunakan 'dalam' operator untuk mencari 'nama' di True
Function.prototype.toString.call ('name'); // Uncaught TypeError: function.prototype.toString tidak generik
【Urierror (error uri)】
Urierror adalah kesalahan yang dilemparkan ketika parameter fungsi terkait URI salah. Ini terutama melibatkan enam fungsi: encodeuri (), decodeuri (), encodeuricomponent (), decodeuricomponent (), Escape () dan Unescape ().
decodeuri ('%2'); // Urierror: Uri Malformed
peristiwa kesalahan
Kesalahan apa pun yang tidak diproses melalui TRY-Catch akan memicu peristiwa kesalahan objek jendela
Acara kesalahan dapat menerima tiga parameter: pesan kesalahan, URL di mana kesalahan berada, dan nomor baris. Dalam kebanyakan kasus, hanya pesan kesalahan yang berguna karena URL hanya memberikan lokasi dokumen, dan nomor baris mengacu pada baris kode yang dapat dari kode javascript tertanam atau dari file eksternal.
Untuk menentukan event handler kesalahan, Anda dapat menggunakan teknologi level DOM0 atau menggunakan format standar acara tingkat DOM2
Salinan kode adalah sebagai berikut:
// Level DOM0
window.onError = function (pesan, url, baris) {
waspada (pesan);
}
// Level DOM2
window.addeventListener ("error", function (pesan, url, baris) {
waspada (pesan);
});
Apakah browser menampilkan pesan kesalahan standar tergantung pada nilai pengembalian OnError. Jika nilai pengembalian salah, pesan kesalahan ditampilkan di konsol; Jika nilai pengembalian benar, itu tidak ditampilkan
Salinan kode adalah sebagai berikut:
// konsol menampilkan pesan kesalahan
window.onError = function (pesan, url, baris) {
waspada (pesan);
mengembalikan false;
}
A;
// Konsol tidak menampilkan pesan kesalahan
window.onError = function (pesan, url, baris) {
waspada (pesan);
Kembali Benar;
}
A;
Acara ini adalah lini pertahanan terakhir untuk menghindari kesalahan pelaporan browser. Idealnya, Anda tidak boleh menggunakannya bila memungkinkan. Selama Anda dapat menggunakan pernyataan mencoba-tangkapan dengan tepat, tidak akan ada kesalahan yang diserahkan ke browser dan peristiwa kesalahan tidak akan dipicu.
Gambar juga mendukung peristiwa kesalahan. Selama URL dalam karakteristik SRC dari gambar tidak dapat mengembalikan format gambar yang diakui, peristiwa kesalahan akan dipicu. Pada saat ini, acara kesalahan mengikuti format DOM dan mengembalikan objek acara yang menargetkan gambar sebagai target
Kotak peringatan muncul saat gambar dimuat. Ketika peristiwa kesalahan terjadi, proses pengunduhan gambar telah berakhir, yang berarti tidak dapat diunduh lagi.
Salinan kode adalah sebagai berikut:
gambar var = gambar baru ();
image.src = 'smilyex.gif';
Image.onError = function (e) {
console.log (e);
}
Lempar pernyataan dan lempar kesalahan
Pernyataan lemparan digunakan untuk melempar kesalahan. Ketika kesalahan dilemparkan, Anda harus menentukan nilai pada pernyataan Throw. Jenis apa nilai ini? Tidak ada persyaratan.
[Catatan] Proses melempar kesalahan diblokir, dan kode selanjutnya tidak akan dijalankan
Salinan kode adalah sebagai berikut:
Lempar 12345;
Lempar 'Hello World';
Lemparkan Benar;
throw {name: 'javascript'};
Anda dapat menggunakan pernyataan lemparan untuk secara manual melempar objek kesalahan
Salinan kode adalah sebagai berikut:
melempar kesalahan baru ('Sesuatu yang buruk terjadi');
Lemparkan Sintakser baru ('Saya tidak menyukai sintaks Anda.');
Lempar TypeError baru ('Jenis variabel apa yang Anda ambil untuk saya?');
Lempar Rangeerror baru ('Maaf, Anda tidak memiliki jangkauan.');
Lempar Evalerror Baru ('yang tidak mengevaluasi.');
Lempar Urierror baru ('Uri, apakah itu kamu?');
Lempar referensi baru ('Anda tidak mengutip referensi Anda dengan benar');
Menggunakan rantai prototipe juga dapat membuat tipe kesalahan khusus dengan mengarahkan kesalahan (rantai prototipe diperkenalkan pada Bab 6). Pada titik ini, Anda perlu menentukan nama dan atribut pesan untuk jenis kesalahan yang baru dibuat
Browser memperlakukan tipe kesalahan khusus yang diwarisi dari kesalahan seperti jenis kesalahan lainnya. Membuat kesalahan khusus bermanfaat jika Anda ingin menangkap kesalahan yang Anda lempar dan perlakukan secara berbeda dari kesalahan browser.
Salinan kode adalah sebagai berikut:
function customError (pesan) {
this.name = 'CustomError';
this.message = pesan;
}
CustomError.prototype = new error ();
Lempar CustomError baru ('Pesan Saya');
Ketika pernyataan lemparan ditemui, kode akan berhenti dieksekusi segera. Kode akan terus mengeksekusi hanya jika pernyataan mencoba-tangkapan menangkap nilai yang dilemparkan.
Penjelasan yang lebih rinci adalah: Ketika pengecualian dilemparkan, penerjemah JavaScript akan segera menghentikan logika yang saat ini dieksekusi dan melompat ke penangan pengecualian terdekat. Penangan pengecualian ditulis dalam klausa tangkapan dari pernyataan mencoba-tangkapan. Jika blok kode yang melempar pengecualian tidak memiliki klausa tangkapan terkait, penerjemah akan memeriksa blok kode tertutup tingkat lebih tinggi untuk melihat apakah ia memiliki penangan pengecualian terkait. Dan seterusnya sampai penangan pengecualian ditemukan. Jika fungsi yang melempar pengecualian tidak menangani pernyataan mencoba-tangkapannya, pengecualian akan disebarkan ke atas ke kode yang memanggil fungsi. Dengan cara ini, pengecualian akan diperbanyak ke atas sepanjang struktur leksikal dari metode JavaScript dan tumpukan panggilan. Jika tidak ada pengecualian penangan yang ditemukan, JavaScript akan menangani pengecualian sebagai kesalahan program dan melaporkannya kepada pengguna
Coba tangkap pernyataan dan tangkap kesalahan
ECMA-262 Edition 3 memperkenalkan pernyataan mencoba-tangkapan sebagai cara standar untuk menangani pengecualian dalam JavaScript, digunakan untuk menangkap dan menangani kesalahan
Di antara mereka, klausa coba menentukan blok kode di mana pengecualian yang perlu diproses berada. Klausa tangkapan mengikuti klausa percobaan. Ketika pengecualian terjadi di suatu tempat di blok coba, logika kode di dalam tangkapan dipanggil. Klausa tangkapan diikuti oleh blok akhirnya, di mana kode pembersih ditempatkan. Terlepas dari apakah pengecualian terjadi di blok coba, logika di dalam blok akhirnya akan selalu dieksekusi. Meskipun tangkapan dan akhirnya opsional, klausa coba membutuhkan setidaknya satu dari keduanya untuk membentuk pernyataan lengkap dengannya.
Semua blok pernyataan coba/tangkap/akhirnya perlu dilampirkan dengan kawat gigi keriting. Kawat gigi di sini diperlukan. Bahkan jika hanya ada satu pernyataan dalam klausa, kawat gigi keriting tidak dapat dihilangkan.
mencoba{
// Secara umum, kode di sini akan mulai dari awal hingga akhir tanpa masalah
// Tapi kadang -kadang pengecualian dilemparkan, baik secara langsung dilemparkan oleh pernyataan lemparan atau secara tidak langsung dengan memanggil metode
} catch (e) {
// Jika dan hanya jika pengecualian dilemparkan oleh blok pernyataan coba, kode di sini akan dieksekusi
// Di sini Anda dapat memperoleh referensi ke objek kesalahan atau nilai lain yang dilemparkan oleh variabel lokal e
// Blok kode di sini dapat menangani pengecualian ini untuk beberapa alasan, atau mengabaikan pengecualian ini, dan juga dapat melemparkan kembali pengecualian melalui pernyataan lemparan
} Akhirnya{
// Terlepas dari apakah pernyataan coba melempar pengecualian, logika di akhirnya akan selalu dieksekusi. Cara -cara untuk mengakhiri blok pernyataan coba adalah:
// 1. Berakhir secara normal, jalankan pernyataan terakhir dari blok pernyataan
// 2. Berakhir melalui istirahat, lanjutkan atau pernyataan pengembalian
// 3. Lemparkan pengecualian, pengecualian ditangkap oleh klausa tangkapan
// 4. Lemparkan pengecualian, pengecualian tidak tertangkap, terus diperbanyak ke atas
}
Secara umum, masukkan semua kode yang mungkin melempar kesalahan di blok pernyataan coba, dan masukkan kode yang digunakan untuk penanganan kesalahan di blok tangkapan
Jika ada kode dalam kesalahan Coba Blok, proses eksekusi kode akan segera keluar dan blok tangkapan akan dieksekusi. Pada saat ini, blok tangkapan akan menerima objek dengan pesan kesalahan. Informasi aktual yang terkandung dalam objek ini akan bervariasi dari browser ke browser, tetapi yang umum adalah bahwa ada atribut pesan yang menyimpan pesan kesalahan
[Catatan] Pastikan untuk memberi nama objek kesalahan. Jika mengosongkannya, kesalahan sintaks akan dilaporkan.
Salinan kode adalah sebagai berikut:
mencoba{
Q;
} catch (error) {
peringatan (error.message); // q tidak didefinisikan
}
// Sintakserror yang Tak Terbaik: Token Tak Terduga)
mencoba{
Q;
}menangkap(){
peringatan (error.message);
}
Catch menerima parameter yang menunjukkan nilai yang dilemparkan oleh blok Coba Kode
Salinan kode adalah sebagai berikut:
function throwit (pengecualian) {
mencoba {
Lemparkan pengecualian;
} catch (e) {
console.log ('tertangkap:'+ e);
}
}
Throwit (3); // Tangkap: 3
lempar ('halo'); // tertangkap: halo
throwit (kesalahan baru ('kesalahan terjadi')); // Tangkap: Kesalahan: Kesalahan terjadi
Setelah blok kode tangkapan menangkap kesalahan, program tidak akan terganggu dan akan terus mengeksekusi sesuai dengan proses normal.
Salinan kode adalah sebagai berikut:
mencoba{
melempar "kesalahan";
} catch (e) {
Console.log (111);
}
Console.log (222);
// 111
// 222
Untuk menangkap berbagai jenis kesalahan, pernyataan penilaian dapat ditambahkan ke blok kode tangkapan
Salinan kode adalah sebagai berikut:
mencoba {
foo.bar ();
} catch (e) {
if (e instanceof evaleRror) {
console.log (e.name + ":" + e.message);
} else if (e instanceof rangeerror) {
console.log (e.name + ":" + e.message);
}
// ...
}
Meskipun klausa akhirnya opsional dalam pernyataan TRY-CATCE, setelah klausa akhirnya digunakan, kodenya akan dieksekusi apa pun yang terjadi. Dengan kata lain, semua kode dalam blok pernyataan coba dieksekusi secara normal, dan akhirnya klausa akan dieksekusi; Jika blok pernyataan tangkapan dieksekusi karena kesalahan, klausa akhirnya masih akan dieksekusi. Selama kode tersebut berisi klausa akhirnya, tidak peduli kode apa yang terkandung dalam blok Coba atau Catch Pernyataan - atau bahkan pernyataan pengembalian, eksekusi klausul akhirnya tidak akan dicegah.
Salinan kode adalah sebagai berikut:
// Kesalahan tidak tertangkap karena tidak ada blok pernyataan tangkapan. Setelah menjalankan blok kode akhirnya, program akan terganggu di mana kesalahan dilemparkan.
fungsi pembersih () {
mencoba {
melempar kesalahan baru ('kesalahan ...');
Console.log ('Baris ini tidak akan dieksekusi');
} Akhirnya {
console.log ('pekerjaan pembersihan lengkap');
}
}
cleansup ();
// Selesaikan pekerjaan pembersihan
// Kesalahan: ada yang salah ...
Salinan kode adalah sebagai berikut:
function testfinnally () {
mencoba{
kembali 2;
} catch (error) {
kembali 1;
} Akhirnya{
kembali 0;
}
}
testfinnally (); // 0
[Catatan] Nilai jumlah pernyataan pengembalian diperoleh sebelum blok kode akhirnya dijalankan.
Salinan kode adalah sebagai berikut:
var count = 0;
function countup () {
mencoba {
jumlah pengembalian;
} Akhirnya {
Count ++;
}
}
countup (); // 0
Console.log (Count); // 1
Salinan kode adalah sebagai berikut:
fungsi f () {
mencoba {
Console.log (0);
lempar "bug";
} catch (e) {
Console.log (1);
Kembali Benar; // Kalimat ini akan ditunda sampai akhir blok kode akhirnya sebelum eksekusi
Console.log (2); // tidak akan berjalan
} Akhirnya {
Console.log (3);
mengembalikan false; // Kalimat ini akan mencakup pengembalian sebelumnya
Console.log (4); // tidak akan berjalan
}
Console.log (5); // tidak akan berjalan
}
var hasil = f ();
// 0
// 1
// 3
console.log (hasil); // false
【Tips】 lingkup level blok
Penggunaan umum pernyataan mencoba-tangkapan adalah untuk membuat lingkup level blok di mana variabel yang dinyatakan hanya valid di dalam tangkapan
ES6 memperkenalkan kata kunci LET untuk membuat ruang lingkup level blok untuk variabel yang dinyatakannya. Namun, dalam situasi saat ini ES3 dan ES5, pernyataan mencoba-tangkapan sering digunakan untuk mencapai efek yang sama
Dari kode berikut, E hanya ada di dalam klausa tangkapan, dan kesalahan akan dilemparkan ketika mencoba merujuknya dari tempat lain.
Salinan kode adalah sebagai berikut:
mencoba{
lempar kesalahan baru (); // Top error
} catch (e) {
console.log (e); // error (...)
}
Console.log (e); // Referenceerror yang Tak Terbang: E tidak didefinisikan
Kesalahan umum
Inti dari penanganan kesalahan adalah terlebih dahulu mengetahui kesalahan apa yang akan terjadi dalam kode. Karena JavaScript secara longgar diketik dan tidak memverifikasi parameter fungsi, kesalahan hanya akan terjadi selama kode. Secara umum, tiga jenis kesalahan perlu diperhatikan: Ketik kesalahan konversi, kesalahan tipe data, dan kesalahan komunikasi
【Ketik kesalahan konversi】
Ketik kesalahan konversi terjadi saat menggunakan operator, atau menggunakan struktur bahasa lain dari tipe data yang dapat secara otomatis mengonversi nilai.
Pernyataan kontrol aliran rentan untuk mengetik kesalahan konversi. Pernyataan seperti IF akan secara otomatis mengonversi nilai apa pun menjadi boolean sebelum menentukan operasi berikutnya. Terutama jika pernyataan, jika digunakan secara tidak benar, mereka kemungkinan besar akan membuat kesalahan.
Variabel yang tidak digunakan secara otomatis ditetapkan nilai yang tidak ditentukan. Nilai yang tidak ditentukan dapat dikonversi ke nilai boolean false, sehingga pernyataan IF dalam fungsi berikut sebenarnya hanya berlaku untuk kasus di mana parameter ketiga disediakan. Masalahnya adalah tidak hanya tidak terdefinisi untuk dikonversi menjadi false, juga bukan hanya nilai string yang dapat dikonversi menjadi benar. Misalnya, jika parameter ketiga adalah nilai 0, tes pernyataan IF akan gagal, dan tes nilai logaritmik 1 akan lulus
Salinan kode adalah sebagai berikut:
function concat (str1, str2, str3) {
var hasil = str1 + str2;
if (str3) {// sama sekali tidak seperti ini
hasil += str3;
}
hasil pengembalian;
}
Menggunakan nilai non-Boolean dalam pernyataan kontrol aliran adalah sumber kesalahan yang sangat umum. Untuk menghindari kesalahan seperti itu, perlu untuk melewati nilai boolean ketika kondisinya dibandingkan. Faktanya, melakukan beberapa bentuk perbandingan dapat mencapai ini
Salinan kode adalah sebagai berikut:
function concat (str1, str2, str3) {
var hasil = str1 + str2;
if (typeof str3 == 'string') {// lebih cocok
hasil += str3;
}
hasil pengembalian;
}
【Kesalahan tipe data】
JavaScript secara longgar diketik dan tidak akan dibandingkan untuk memastikan bahwa tipe data mereka benar sampai variabel dan parameter fungsi digunakan. Untuk memastikan bahwa kesalahan tipe data tidak akan terjadi, hanya kode deteksi tipe data yang sesuai yang dapat ditulis. Kesalahan tipe data kemungkinan besar terjadi ketika memberikan nilai yang tidak terduga ke fungsi plot
Salinan kode adalah sebagai berikut:
// fungsi yang tidak aman, nilai non-array apa pun akan menyebabkan kesalahan
fungsi reversesort (nilai) {
if (values) {
values.sort ();
nilai.reverse ();
}
}
Kesalahan umum lainnya adalah membandingkan parameter dengan nilai nol. Dibandingkan dengan null hanya memastikan bahwa nilai yang sesuai tidak nol dan tidak terdefinisi. Untuk memastikan bahwa nilai yang dilewati valid, itu tidak cukup untuk mendeteksi nilai nol saja
Salinan kode adalah sebagai berikut:
// fungsi yang tidak aman, nilai non-array apa pun akan menyebabkan kesalahan
fungsi reversesort (nilai) {
if (values! = null) {
values.sort ();
nilai.reverse ();
}
}
Jika suatu objek yang berisi metode sort () (bukan array) dilewati, itu akan melewati deteksi, tetapi kesalahan dapat terjadi saat memanggil fungsi terbalik ()
Salinan kode adalah sebagai berikut:
// fungsi yang tidak aman, nilai non-array apa pun akan menyebabkan kesalahan
fungsi reversesort (nilai) {
if (typeof values.sort == 'function') {
values.sort ();
nilai.reverse ();
}
}
Jika Anda tahu persis jenis apa yang harus Anda lewati, yang terbaik adalah menggunakan instance dari untuk mendeteksi tipe datanya
Salinan kode adalah sebagai berikut:
// Nilai aman, non-array diabaikan
fungsi reversesort (nilai) {
if (nilai instance array) {
values.sort ();
nilai.reverse ();
}
}
【Kesalahan komunikasi】
Dengan munculnya pemrograman AJAX, telah menjadi hal biasa bagi aplikasi web untuk memuat informasi atau fungsionalitas secara dinamis selama siklus hidup mereka. Namun, komunikasi apa pun antara JavaScript dan server dapat menyebabkan kesalahan
Masalah yang paling umum adalah bahwa data tidak dikodekan menggunakan encodeuricomponent () sebelum mengirimnya ke server
Salinan kode adalah sebagai berikut:
//kesalahan
http://www.yourdomain.com/?redir=http://www.sometherdomain.com?a=b&c=d
// Memanggil Encodeuricomponent () untuk semua string setelah 'redir =' dapat menyelesaikan masalah ini
http://www.yourdomain.com/?redir=http:%3a%2f%2fwww.sometherdomain.com%3fa%3db%26c%3dd