Kekeliruan tentang pembolehubah global JavaScript
ringa_lee
ringa_lee 2017-05-18 10:56:05
0
5
596

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_lee
ringa_lee

ringa_lee

membalas semua(5)
刘奇
// ①
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.

刘奇

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...

某草草

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

伊谢尔伦

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;

  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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan