cari

Rumah  >  Soal Jawab  >  teks badan

Kekeliruan tentang pembolehubah global JavaScript

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!

ringa_leeringa_lee2779 hari yang lalu598

membalas semua(5)saya akan balas

  • 怪我咯

    怪我咯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.

    balas
    0
  • 怪我咯

    怪我咯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...

    balas
    0
  • 某草草

    某草草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

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-18 10:58:05

    Untuk isu skop ini, anda boleh membaca "Javascript You Don't Know" (Jilid 1), semuanya dibincangkan di atas

    balas
    0
  • 怪我咯

    怪我咯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;

    1. Apabila menemui var a, pengkompil akan bertanya skop sama ada sudah ada pembolehubah dengan nama ini dalam koleksi skop yang sama. Jika ya, pengkompil akan mengabaikan pengisytiharan dan meneruskan penyusunan jika tidak, ia akan meminta skop untuk mengisytiharkan pembolehubah baharu dalam koleksi skop semasa dan menamakannya a.

    2. Seterusnya, pengkompil akan menjana kod yang diperlukan untuk enjin berjalan pada masa jalan Kod ini digunakan untuk mengendalikan operasi penetapan a=1. Apabila enjin berjalan, ia mula-mula bertanya skop sama ada terdapat pembolehubah yang dipanggil a dalam koleksi skop semasa Jika ya, enjin akan menggunakan pembolehubah ini, jika tidak, enjin akan terus mencari pembolehubah.

    3. balas
      0
  • Batalbalas