javascript - Kekeliruan dengan contoh pengisytiharan fungsi dalam Elevation
淡淡烟草味
淡淡烟草味 2017-06-26 10:50:47
0
2
689

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!

淡淡烟草味
淡淡烟草味

membalas semua(2)
为情所困

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()
三叔

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.

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