Rumah >hujung hadapan web >tutorial js >Mari kita bincangkan tentang promosi pengisytiharan dalam JavaScript
Artikel ini membawa anda pengetahuan yang berkaitan tentang JavaScript, yang terutamanya memperkenalkan kandungan yang berkaitan tentang promosi perisytiharan ialah ciri penghurai JavaScript, yang akan menjejaskan fungsi dalam kod daripada pernyataan pengisytiharan pembolehubah diekstrak ke hadapan skop di mana ia terletak. Saya harap ia akan membantu semua orang.
[Cadangan berkaitan: Tutorial video JavaScript, bahagian hadapan web]
Peningkatan penyata (penghosan ) ialah ciri penghurai JavaScript, ia akan mengekstrak fungsi dan penyataan pengisytiharan berubah dalam kod ke hadapan skop di mana ia berada.
JavaScript menyokong fungsi panggilan sebelum ia diisytiharkan.
say();function say() { console.log("Hello"); }
Penghuraikan akan mengimbas kod dalam skop dan mengekstrak pengisytiharan fungsi ke hadapan kod pelaksanaan. Jadi, beginilah cara penghurai melihat kod ini:
function say() { console.log("Hello"); }say();
Selain fungsi biasa, async function
, function *
, async function *
juga mempunyai kesan peningkatan yang sama.
var
Promosi pengisytiharan pembolehubah var
Perisytiharan pembolehubah kata kunci akan dinaikkan pangkat, tetapi penetapan pembolehubah tidak akan dinaikkan pangkat.
console.log(foo); // undefinedvar foo = "bar";console.log(foo); // 'bar'
Hasil penghuraian kod di atas ialah:
var foo;console.log(foo); foo = "bar";console.log(foo);
Ini mungkin membawa kepada beberapa masalah pelik:
var x = "x in global"; (function () { // 这里期望读取全局变量 console.log(x); // 结果为undefined. /* ... */ // 在函数内某处 var x = "x in function"; })();
Dulu, mengikut urutan untuk mengelakkan peningkatan yang pelik ini, setiap orang secara amnya menulis pernyataan var
di hadapan skop.
var x='x';var y='y';function (){ var x; var foo; // ...}
Sudah tentu, kini kami memilih untuk tidak menggunakan var
dan menggunakan let
dan const
yang lebih munasabah.
let
dan const
Pengisytiharan berubah dan zon mati Jadi, tiada promosi berubah dalam let
dan const
? —— Tidak semestinya.
Lihat contoh ini:
const x = "x in global"; (function () { // 这里期望读取全局变量 console.log(x); // ReferenceError: Cannot access 'x' before initialization /* ... */ // 在函数内某处 const x = "x in function"; })();
Ralat pelaksanaan dilaporkan, menunjukkan bahawa baris const x = "x in function";
mempengaruhi kod kawasan atas dalam skop. Penghurai
akan mengimbas pengisytiharan const
dan let
dalam skop semasa, dan ReferenceError
akan dicetuskan jika nama pembolehubah digunakan sebelum pernyataan pengisytiharan. Ini mengelakkan var
masalah angkat dan corak kod samar-samar yang dinyatakan di atas. Kesan yang sama berlaku dengan kata kunci
class
, begitu juga dengan new
kelas yang tidak diisytiharkan ReferenceError
.
new MyClass(); // ReferenceError: Cannot access 'MyClass' before initializationclass MyClass {}
Sesetengah orang berpendapat bahawa keadaan ini bukanlah satu penambahbaikan, lagipun, pengisytiharan dan penugasan tidak dibuat lebih awal; yang lain berpendapat bahawa kenyataan ini mempunyai kesan sebelum ia dilaksanakan, dan kesannya adalah bertambah baik. Secara peribadi, saya lebih suka yang terakhir, iaitu penambahbaikan pengecam (nama pembolehubah dan kelas).
Kesan beberapa pernyataan pengisytiharan JavaScript akan mempengaruhi keseluruhan skop di mana ia berada Fenomena ini dipanggil promosi.
Terdapat 3 jenis angkat:
function
Kedua-dua pengisytiharan dan penugasan kata kunci dinaikkan. var
Pengisytiharan kata kunci dipromosikan, tetapi tugasan tidak. let
, const
, class
Pengecam dinaikkan pangkat, membentuk zon mati dan pengisytiharan mahupun tugasan tidak digalakkan. [Cadangan berkaitan: Tutorial video JavaScript, bahagian hadapan web]
Atas ialah kandungan terperinci Mari kita bincangkan tentang promosi pengisytiharan dalam JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!