這是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!')
}
}
因為第一個是函數聲明, 但是一般不會放在if-else中聲明函數
第二個是把匿名函數賦值給變數 ,不存在提升之類的
直接寫function xxx(){} 會導致聲明提前,如果有兩個同名的這樣的函數,相當於在頂部執行了兩次var xxx,所以無效
和什麼聲明前置沒有關係,高程第三部那時候JavaScript規格還都是ES5,瀏覽器還沒有實現區塊級作用域(ES2016+),作用域等級只是函數等級的。所以你寫的
和寫的
沒有本質區別
js是有聲明提前的! ! ! function會在宣告時直接提到作用域頂端。 if中不存在作用域,所以兩個function是一個作用域,第二個會取代第一個。 ! 而你第二段程式碼,先宣告了變數sayhi,在if判斷後才對sayhi賦值,