《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!
求教,多謝!
true是一個字面量,不是一個變量,瀏覽器在解析的時候會把你這個if語句直接優化掉,類似於這樣:
然而作者指的是另一種情況
編譯器拿到這段程式碼以後,發現有兩個在同一個作用域中的重複函數聲明,第一個聲明會直接被第二個聲明取代掉。
js確實是不推薦在區塊內部宣告函數的。
在嚴格模式下,這段程式碼直接報錯。