Rumah > Soal Jawab > teks badan
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!
怪我咯2017-05-18 10:58:05
// ①
console.log(b); // 代码执行到这行的时候,b未定义,在当前的作用域链上找不到b,所以 b is not defined
b = 2;
// ②
console.log(b);
var b = 2;
// 由于变量声明提升,相当于
var b;
console.log(b); // 代码执行到这行的时候,b已经声明了,只是没有赋值而已,所以 undefined
b = 2;
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.
怪我咯2017-05-18 10:58:05
Tanya dan jawab soalan anda sendiri dan tambah satu perkara lagi:
Saya jumpa ayat ini di mdn:
Pembolehubah yang diisytiharkan dibuat sebelum sebarang kod dilaksanakan, manakala pembolehubah yang tidak diisytiharkan hanya dibuat apabila operasi penugasan dilakukan.
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...
某草草2017-05-18 10:58:05
Pengisytiharan akan dibuat lebih awal
console.log(a);
var a = 1;
akan ditafsirkan oleh penyusun sebagai
var a;
console.log(a);
a = 1;
Dan tidak diisytiharkan/tidak ditentukan tidak mempunyai peluang untuk dinaikkan pangkat, jadi ralat akan dilaporkan sebaik sahaja ia digunakan
伊谢尔伦2017-05-18 10:58:05
Untuk isu skop ini, anda boleh membaca "Javascript You Don't Know" (Jilid 1), semuanya dibincangkan di atas
怪我咯2017-05-18 10:58:05
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;