Menurut spesifikasi ECMAScript, tingkah laku ini sebenarnya adalah sebahagian daripada penciptaan "persekitaran leksikal" yang diselaraskan dalam peringkat penciptaan JavaScript. Tetapi janganlah kita terlalu teknikal, ingatlah bahawa JavaScript akan "mengimbas" sebelum menjalankan kod.
penambahbaikan
var
console.log(x); // 输出:undefined var x = 5; console.log(x); // 输出:5
belum diperbaiki. Inilah sebabnya output <出> pertama var x
bukannya membuang ralat. Pembolehubah ada, tetapi ia belum diberikan. x = 5
console.log(x)
<<> dan undefined
kawasan mati sementara (TDZ) x
let
telah diperbaiki, tetapi ia terletak di kawasan mati sementara (TDZ) sebelum permulaan. Cuba akses const
sebelum permulaan akan membawa kepada console.log(y); // 抛出ReferenceError: Cannot access 'y' before initialization let y = 10; console.log(y); // 输出:10
dalam keadaan yang sama. let y
y
ReferenceError
Ini juga termasuk apa -apa kandungan yang menggunakan pengisytiharan <这> atau var
, tentu saja, juga termasuk fungsi. var
undefined
sebelum akses awal, kenyataan moden ini akan disalahpahami. Spesifikasi ECMAScript merujuk kepada tingkah laku ini sebagai "semantik rantau mati sementara", tetapi saya menyebutnya "JavaScript menjadikan kita jujur."Bercakap tentang kawasan mati sementara, ini adalah di mana
kembalilet
danconst
mengisytiharkan sebelum permulaan. Berbeza dengan <始> apabila
let
const
Apa yang berlaku di sini? Perisytiharan fungsional <提> telah diperbaiki, jadi kita boleh memanggilnya terlebih dahulu. Tetapi bagaimana dengan <呢>? Ia masih kekal di tempatnya. Inilah sebabnya <部> lawatan var
akan memberi kami undefined
, dan kami cuba membacanya sebelum skrip siap.
function setupEventHandler() { handleClick(); // 可运行! const config = { debug: true, }; function handleClick() { if (config?.debug) { // 未定义! console.log("Debug mode"); } } } setupEventHandler();
handleClick
config
Walaupun kelas diperbaiki, mereka masih berada di "zon mati sementara" sebelum definisi mereka dinilai. Ini bermakna anda tidak boleh mengaksesnya sebelum anda mengisytiharkannya. handleClick
config
undefined
ingat, kenyataan itu dipindahkan ke bahagian atas, tetapi permulaannya tidak berubah.
Atas ialah kandungan terperinci JavaScript Hoisting - Apa yang bergerak dan apa yang kekal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!