搜尋

首頁  >  問答  >  主體

javascript - 高程中一個函數宣告例子的困惑

《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!

求教,多謝!

淡淡烟草味淡淡烟草味2737 天前691

全部回覆(2)我來回復

  • 为情所困

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

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

    回覆
    0
  • 三叔

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

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

    回覆
    0
  • 取消回覆