這是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!')
}
}
伊谢尔伦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')
}
沒有本質區別
PHP中文网2017-07-05 10:40:34
js是有聲明提前的! ! ! function會在宣告時直接提到作用域頂端。 if中不存在作用域,所以兩個function是一個作用域,第二個會取代第一個。 ! 而你第二段程式碼,先宣告了變數sayhi,在if判斷後才對sayhi賦值,