搜尋

首頁  >  問答  >  主體

javascript - 看到函數宣告這塊有個函數不是很理解

這是js高程上面的一個例子
看到函數宣告有一個程式碼

if(condition){
    function sayHi(){
        alert('hi')
    }
}else{
    function sayHi(){
        alert('Yo')
    }
}

說是這段程式碼無效語法,大多數瀏覽器會回傳第二個聲明,firefox會回傳第一個聲明,這是為什麼?
如果改成函數表達式形式的就可以了,這又是為什麼?

var sayHi;
if(condition){
    sayHi=function(){
        alert('Hi')
    }
}else{
    sayHi=function(){
        alert('Yo!')
    }
}
我想大声告诉你我想大声告诉你2732 天前807

全部回覆(4)我來回復

  • 黄舟

    黄舟2017-07-05 10:40:34

    因為第一個是函數聲明, 但是一般不會放在if-else中聲明函數

    第二個是把匿名函數賦值給變數 ,不存在提升之類的

    回覆
    0
  • 黄舟

    黄舟2017-07-05 10:40:34

    直接寫function xxx(){} 會導致聲明提前,如果有兩個同名的這樣的函數,相當於在頂部執行了兩次var xxx,所以無效

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-07-05 10:40:34

    和什麼聲明前置沒有關係,高程第三部那時候JavaScript規格還都是ES5,瀏覽器還沒有實現區塊級作用域(ES2016+),作用域等級只是函數等級的。所以你寫的

    if(condition){
        function sayHi(){
            alert('hi')
        }
    }else{
        function sayHi(){
            alert('Yo')
        }
    }

    和寫的

    function sayHi(){
      alert('hi')
    }
    function sayHi(){
      alert('Yo')
    }

    沒有本質區別

    回覆
    0
  • PHP中文网

    PHP中文网2017-07-05 10:40:34

    js是有聲明提前的! ! ! function會在宣告時直接提到作用域頂端。 if中不存在作用域,所以兩個function是一個作用域,第二個會取代第一個。 ! 而你第二段程式碼,先宣告了變數sayhi,在if判斷後才對sayhi賦值,

    回覆
    0
  • 取消回覆