Tidak kira di mana pernyataan pengisytiharan pembolehubah JavaScript muncul, ia akan dilaksanakan terlebih dahulu sebelum kod lain. Skop pembolehubah yang diisytiharkan menggunakan kata kunci var ialah konteks pelaksanaan semasa, yang mungkin merupakan fungsi sekeliling, atau, apabila pembolehubah diisytiharkan di luar badan fungsi, ia adalah pembolehubah global.
Perkara yang ditakrifkan di luar badan fungsi ialah pembolehubah global dan yang ditakrifkan di dalam badan fungsi ialah pembolehubah tempatan. Takrifan di sini merujuk kepada pengisytiharan melalui var.
JavaScript mempunyai konsep global tersirat, yang bermaksud bahawa mana-mana pembolehubah yang anda tidak isytiharkan akan menjadi sifat objek global. Contohnya:
function test(){ myname = "huming"; alert(myname); } test(); // "huming" alert(myname); //"huming"
Kedua-dua keputusan adalah sama, menunjukkan bahawa nama saya ialah pembolehubah global.
Jadi, adakah terdapat perbezaan antara pembolehubah global tersirat dan pembolehubah global yang ditakrifkan secara eksplisit? . Jawapannya pasti ya, lihat contoh di bawah:
// 定义三个全局变量 var global_test = ; global_test = ; // 反面教材 (function () { global_test = ; // 反面教材 }()); // 试图删除 delete global_test; // false delete global_test; // true delete global_test; // true // 测试该删除 alert(typeof global_test); // "number" alert(typeof global_test); // "undefined" alert(typeof global_test); // "undefined"
Seperti yang dapat dilihat daripada contoh di atas: global_test1 yang ditakrifkan oleh var di luar fungsi tidak boleh dipadamkan, dan global_test2 dan global_test3 yang tidak ditakrifkan oleh var akan dipadamkan (tidak kira sama ada ia dicipta dalam badan fungsi).
Ringkasnya, pembolehubah global yang diisytiharkan melalui var di luar fungsi tidak boleh dipadamkan, tetapi pembolehubah global tersirat boleh dipadamkan.
Perlu diingatkan di sini: JavaScript mempunyai gelagat yang dipanggil "mengangkat" (menggantung/penghuraian atas/pra-penghuraian).
Mari kita ilustrasikan dengan contoh:
var myname = "huming"; //声明全局变量 function test() { alert(myname); var myname = "local_huming"; alert(myname); } test();
Adakah anda fikir kandungan kedua-dua makluman itu konsisten? ? Jelas sekali tidak konsisten, tidak perlu dikatakan konsisten. . Output sebenar ialah: "undefined", "local_huming".
Contoh di atas adalah bersamaan dengan
var myname = "huming"; //声明全局变量 function test() { var myname; alert(maname);<br> myname = "local_huming"; alert(myname); // "local" } test();
Output myname oleh makluman pertama bukanlah pembolehubah global yang anda fikirkan, tetapi pembolehubah tempatan dalam skop yang sama (badan fungsi) dengannya. Walaupun ia tidak diisytiharkan, ia dianggap sedemikian. Ini dipanggil "angkat angkat".
Ini sepatutnya menjelaskannya. Apabila anda menggunakan pembolehubah dalam badan fungsi dan mengisytiharkannya semula kemudian, ralat mungkin berlaku.
Spesifikasi penulisan:
function test() { var a = , b = , c = a + b, d = {}, e, f; // function body... }
Faedahnya ialah:
1. Semua pembolehubah tempatan ditakrifkan pada permulaan fungsi untuk carian mudah;
Dalam JavaScript, terdapat empat cara untuk nama pembolehubah memasuki skop
Bahasa terbina dalam, semua skop mempunyai kata kunci ini dan hujah
Empat pesanan yang disenaraikan di atas juga merupakan susunan keutamaan dari tinggi ke rendah Setelah nama pembolehubah telah diisytiharkan, ia tidak boleh ditimpa oleh borang pengisytiharan pembolehubah keutamaan yang lebih rendah.