javascript - jika pernyataan mempengaruhi pengisytiharan fungsi
滿天的星座
滿天的星座 2017-06-12 09:27:40
0
3
689
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

滿天的星座
滿天的星座

membalas semua(3)
伊谢尔伦

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:

if (true) {
    function f() {}
}

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:

  1. Benarkan fungsi ditakrifkan dalam skop blok

  2. Pengisytiharan fungsi sebenarnya akan serupa dengan ungkapan fungsi yang diisytiharkan menggunakan var, dan nama fungsi akan dinaikkan pangkat ke bahagian atas skop fungsi semasa

  3. Pada 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不是函数,换句话来说,就是eRalat ini bermakna e bukan fungsi Dalam erti kata lain, pembolehubah e wujud, tetapi ia bukan fungsi. Menggabungkan tiga peraturan yang kami nyatakan di atas, mudah untuk berfikir bahawa ia sebenarnya berjalan seperti ini:

console.log(e());//error

if(true){
    var e = function() {
        return 10;
    }
}

Selepas promosi berubah-ubah, ia akan menjadi seperti ini:

var e;
console.log(e());

if(true){
    e = function() {
        return 10;
    }
}

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

学霸

if(true){
    function e() {
        return 10;
    }
}

bersamaan dengan =>

var e
//e为undefined 所以下面报错
console.log(e());//error
if(true) {
    e = function() {
        return 10;
    }
    //if内的其他语句
}
//e已经被修改为function了,所以下面的语句正常
console.log(e());//10
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!