javascript - 看到函數宣告這塊有個函數不是很理解
我想大声告诉你
我想大声告诉你 2017-07-05 10:38:34
0
4
803

這是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!')
    }
}
我想大声告诉你
我想大声告诉你

全部回覆(4)
黄舟

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

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

黄舟

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

伊谢尔伦

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

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

和寫的

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

沒有本質區別

洪涛

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

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