這是js高程上面的一個例子
看到函數(shù)聲明有一個代碼
if(condition){
function sayHi(){
alert('hi')
}
}else{
function sayHi(){
alert('Yo')
}
}
說是這段代碼無效語法,大多數(shù)瀏覽器會返回第二個聲明,firefox會返回第一個聲明,這是為什么?
如果改成函數(shù)表達(dá)式形式的就可以了,這又是為什么?
var sayHi;
if(condition){
sayHi=function(){
alert('Hi')
}
}else{
sayHi=function(){
alert('Yo!')
}
}
因為第一個是函數(shù)聲明, 但是一般不會放在if-else中聲明函數(shù)
第二個是把匿名函數(shù)賦值給變量 ,不存在提升之類的
直接寫function xxx(){} 會導(dǎo)致聲明提前,如果有兩個同名的這樣的函數(shù),相當(dāng)于在頂部執(zhí)行了兩次var xxx,所以無效
和什么聲明前置沒有關(guān)系,高程第三部那時候JavaScript規(guī)范還都是ES5,瀏覽器還沒有實現(xiàn)塊級作用域(ES2016+),作用域級別只是函數(shù)級別的。所以你寫的
if(condition){
function sayHi(){
alert('hi')
}
}else{
function sayHi(){
alert('Yo')
}
}
和寫的
function sayHi(){
alert('hi')
}
function sayHi(){
alert('Yo')
}
沒有本質(zhì)區(qū)別
js是有聲明提前的?。。unction會在聲明時直接提到作用域頂端。if中不存在作用域,所以兩個function是一個作用域,第二個會替掉第一個。! 而你第二段代碼,先聲明了變量sayhi,在if判斷后才對sayhi進(jìn)行賦值,