cari

Rumah  >  Soal Jawab  >  teks badan

javascript - jika pernyataan mempengaruhi pengisytiharan fungsi

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

滿天的星座滿天的星座2724 hari yang lalu710

membalas semua(3)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-06-12 09:29:40

    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.

    balas
    0
  • 滿天的星座

    滿天的星座2017-06-12 09:29:40

    Pengisytiharan fungsi dalam pernyataan if tidak akan dipromosikan, sama seperti ungkapan fungsi, jadi yang pertama adalah ralat sintaks, dan yang kedua akan mengeluarkan 10

    balas
    0
  • 欧阳克

    欧阳克2017-06-12 09:29:40

    
    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

    balas
    0
  • Batalbalas