console.log(e());//error
if(true){
function e() {
return 10;
}
}
if(true){
function e() {
return 10;
}
}
console.log(e());//10
Jika promosi pengisytiharan fungsi hanya dinaikkan ke skop if, maka apakah sebab perkara di atas? (Ujian Chrome 58) Mengapa boleh berfungsi dalam skop jika boleh diakses dari luar. Tolong beri saya jawapan
Ini sebenarnya isu sejarah...
Sebelum ini dalam ES5, spesifikasi menetapkan bahawa fungsi hanya boleh diisytiharkan dalam skop peringkat atas dan skop fungsi, dan bukan dalam skop peringkat blok. Oleh itu, kenyataan seperti ini sebenarnya adalah haram:
Tetapi sebenarnya, semua pelayar utama tidak mematuhi spesifikasi ini kerana pertimbangan keserasian.
Dalam era ES6 semasa, spesifikasi menetapkan kewujudan skop peringkat blok, dan fungsi boleh ditakrifkan dalam skop peringkat blok.
Tetapi sebenarnya, perkara ini tidak semudah itu, kerana dalam kes ini, tingkah laku fungsi yang ditentukan akan tidak serasi dengan masa lalu Untuk memastikan keserasian dengan masa lalu, ES6 menetapkan dalam Lampiran B bahawa pelaksanaan penyemak imbas tidak diperlukan. untuk mematuhi peraturan di atas Mempunyai cara tingkah laku anda sendiri.
Dalam pelayar ES6, mereka sebenarnya berkelakuan seperti ini:
Benarkan fungsi ditakrifkan dalam skop blok
Pengisytiharan fungsi sebenarnya akan serupa dengan ungkapan fungsi yang diisytiharkan menggunakan
var
, dan nama fungsi akan dinaikkan pangkat ke bahagian atas skop fungsi semasaPada masa yang sama, pengisytiharan fungsi juga akan mengekalkan tingkah laku angkat dalam skop peringkat blok
Untuk kod pertama anda, jika anda melihat lebih dekat pada ralat yang dilaporkan, anda akan mendapati bahawa ralat adalah seperti ini:
Uncaught TypeError: e is not a function
.Uncaught TypeError: e is not a function
。这个错误表示,
e
不是函数,换句话来说,就是e
Ralat ini bermaknae
bukan fungsi Dalam erti kata lain, pembolehubahe
wujud, tetapi ia bukan fungsi. Menggabungkan tiga peraturan yang kami nyatakan di atas, mudah untuk berfikir bahawa ia sebenarnya berjalan seperti ini:Selepas promosi berubah-ubah, ia akan menjadi seperti ini:
Tidak perlu menyebut kod kedua.
Pengisytiharan fungsi dalam pernyataan if tidak akan dipromosikan, sama seperti ungkapan fungsi, jadi yang pertama adalah ralat sintaks, dan yang kedua akan mengeluarkan 10
bersamaan dengan =>