javascript - 高程中一個函數宣告例子的困惑
淡淡烟草味
淡淡烟草味 2017-06-26 10:50:47
0
2
658

《JavaScript 高階程式設計》第七章函數,關於函數宣告的提升問題,有這樣一個例子:

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

書上原文說:

表面上看,以上程式碼表示在condition 為true 時,使用一個sayHi()的定義;否則,就使用另一個定義。實際上,這在ECMAScript 中屬於無效語法,JavaScript 引擎會嘗試修正錯誤,並將其轉換為合理的狀態。但問題是瀏覽器嘗試修正錯誤的做法並不一致。大多數瀏覽器會傳回第二個聲明,忽略condition;Firefox 會在condition 為true 時傳回第一個聲明。因此這種使用方式很危險,不應該出現在你的程式碼中。

但是我在chrome 和js bin裡面測試,把condition 改成true,都能alert“Hi”,並沒有出現書上說的“大多數瀏覽器會返回第二個聲明,忽略condition”的問題,這是為什麼呢:

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

求教,多謝!

淡淡烟草味
淡淡烟草味

全部回覆(2)
为情所困

true是一個字面量,不是一個變量,瀏覽器在解析的時候會把你這個if語句直接優化掉,類似於這樣:

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

变成
function sayHi(){
    alert("Hi!");
}

然而作者指的是另一種情況


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

編譯器拿到這段程式碼以後,發現有兩個在同一個作用域中的重複函數聲明,第一個聲明會直接被第二個聲明取代掉。
js確實是不推薦在區塊內部宣告函數的。
在嚴格模式下,這段程式碼直接報錯。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板