Kod berikut:
console.log(b);
b = 2;
//"ReferenceError: b is not defined
Saya fikir ia tidak akan ditentukan apabila dicetak.
Menurut pemahaman saya, b = 2 tidak menggunakan var, jadi ia mengisytiharkan pembolehubah global Memandangkan pembolehubah diisytiharkan, akan ada promosi pengisytiharan berubah Mengapa terdapat ReferenceError: b tidak ditakrifkan.
Dan cuba tambah var:
console.log(b);
var b = 2;
//undefined
Jadi nampaknya menggunakan var dan meninggalkan var bukan sekadar perbezaan antara pengisytiharan tempatan dan global?
Pemula, sila beri saya nasihat, terima kasih!
Selalu ada urutan pelaksanaan kod. . .
Mata tambahan:
adalah secara langsung
b = 2
这种创建全局变量的方式,其实质是变为全局对象上的一个属性,即window.b = 2
, jadi tiada promosi atau tiada pembolehubah yang diisytiharkan menggunakan var mempunyai promosi pengisytiharan.Tanya dan jawab soalan anda sendiri dan tambah satu perkara lagi:
Saya jumpa ayat ini di mdn:
Ayat ini menerangkan kekeliruan saya tentang mengapa pembolehubah global b tidak dipromosikan seperti a. a ialah pembolehubah yang diisytiharkan, manakala b ialah pembolehubah tidak diisytiharkan yang hanya ditakrifkan semasa pelaksanaan, jadi tidak digalakkan sebelum pelaksanaan.
Teks asal: https://developer.mozilla.org...
Pengisytiharan akan dibuat lebih awal
akan ditafsirkan oleh penyusun sebagai
Dan tidak diisytiharkan/tidak ditentukan tidak mempunyai peluang untuk dinaikkan pangkat, jadi ralat akan dilaporkan sebaik sahaja ia digunakan
Untuk isu skop ini, anda boleh membaca "Javascript You Don't Know" (Jilid 1), semuanya dibincangkan di atas
Enjin---
Bertanggungjawab untuk proses penyusunan dan pelaksanaan keseluruhan program JavaScript dari awal hingga akhir.
Penyusun---
Rakan enjin, bertanggungjawab untuk analisis sintaks dan penjanaan kod.
Skop---
Satu lagi rakan enjin, bertanggungjawab untuk mengumpul dan menyelenggara satu siri pertanyaan yang terdiri daripada pengecam yang diisytiharkan (pembolehubah) dan menguatkuasakan satu set peraturan yang sangat ketat yang menentukan kesan kod yang sedang dilaksanakan pada pengecam ini hak akses.
Apabila anda melihat var a = 1;
Malah, enjin berpendapat terdapat dua pengisytiharan yang sama sekali berbeza di sini, satu diproses oleh pengkompil pada masa penyusunan, dan satu lagi diproses oleh enjin pada masa jalan.
var a=1;