cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Kekeliruan dengan contoh pengisytiharan fungsi dalam Elevation

Fungsi "JavaScript Advanced Programming" Bab 7, mengenai promosi pengisytiharan fungsi, terdapat contoh sedemikian:

if(condition){
    function sayHi(){
        alert("Hi!");
    }
} else {
    function sayHi(){
        alert("Yo!");
    } 
}

Teks asal dalam buku itu berkata:

Di permukaan, kod di atas bermakna apabila keadaan adalah benar, gunakan satu definisi sayHi( jika tidak, gunakan definisi lain. Sebenarnya, ini adalah sintaks yang tidak sah dalam ECMAScript, dan enjin JavaScript akan cuba membetulkan ralat dan menukarnya kepada keadaan yang munasabah. Tetapi masalahnya ialah penyemak imbas tidak konsisten dalam percubaan mereka untuk membetulkan ralat. Kebanyakan pelayar akan mengembalikan pernyataan kedua, mengabaikan syarat, Firefox akan mengembalikan pernyataan pertama jika syarat adalah benar. Oleh itu penggunaan ini berbahaya dan tidak boleh digunakan dalam kod anda.

Tetapi saya mengujinya dalam chrome dan js bin dan menukar syarat kepada benar, dan ia boleh memberi amaran kepada "Hai". :

if(true){
    function sayHi(){
        alert("Hi!");
    }
} else {
    function sayHi(){
        alert("Yo!");
    } 
}
sayHi();// Hi!

Sila beri nasihat, terima kasih!

淡淡烟草味淡淡烟草味2787 hari yang lalu729

membalas semua(2)saya akan balas

  • 为情所困

    为情所困2017-06-26 10:52:47

    true ialah literal, bukan pembolehubah Penyemak imbas akan terus mengoptimumkan pernyataan if anda semasa menghuraikan, sama seperti ini:

    if(true){
        function sayHi(){
            alert("Hi!");
        }
    } else {
        function sayHi(){
            alert("Yo!");
        } 
    }
    
    变成
    function sayHi(){
        alert("Hi!");
    }
    

    Namun, penulis merujuk kepada situasi lain

    
    if(condition){
    function sayHi(){
        alert("Hi!");
        }
    } else {
        function sayHi(){
            alert("Yo!");
        } 
    }
    var condition = true
    sayHi()

    balas
    0
  • 三叔

    三叔2017-06-26 10:52:47

    Selepas pengkompil mendapat kod ini, ia mendapati terdapat dua pengisytiharan fungsi pendua dalam skop yang sama. Pengisytiharan pertama akan digantikan secara langsung dengan pengisytiharan kedua.
    js tidak mengesyorkan mengisytiharkan fungsi di dalam blok.
    Dalam mod ketat, kod ini melaporkan ralat secara langsung.

    balas
    0
  • Batalbalas