5 回答

TA貢獻1851條經(jīng)驗 獲得超5個贊
javascript雖然是解釋執(zhí)行的語言,但也會進行預(yù)編譯。
1 2 3 4 5 6 7 8 9 | if(condition){ function sayHi(){ alert("Hi!"); } }else{ function sayHi(){ alert("Yo!"); } } |
這種形式,JS引擎在預(yù)編譯的過程中會注冊方法到window對象下,就是window.sayHi。
而不會顧及if else條件,導(dǎo)致重復(fù)的sayHi方法被注冊,在這種情況下是無效語法。
1 2 3 4 5 6 7 8 9 10 | var sayHi; if(condition){ sayHi=function sayHi(){ alert("Hi!"); }; }else{ sayHi=function sayHi(){ alert("Yo!"); }; } |
而下面這種是作為一個 變量(而非函數(shù)function),變量是可以被重復(fù)賦值的,所以語法不會有問題。
不知道有沒有說清楚。

TA貢獻1786條經(jīng)驗 獲得超11個贊
我只說第一個。
第一個語法上沒什么問題,但是和瀏覽器解析js不同而獲得意想不到的結(jié)果。
1. 在前面調(diào)用。
1 2 3 4 5 6 7 8 9 10 11 | sayHi(); var condition = true; if(condition){ function sayHi(){ alert("Hi!"); } }else{ function sayHi(){ alert("Yo!"); } } |
這種時候除了firefox會報錯,其他的瀏覽器會彈出“Yo!"。
2. 在后面調(diào)用
1 2 3 4 5 6 7 8 9 10 | if(true){ function sayHi(){ alert("Hi!"); } }else{ function sayHi(){ alert("Yo!"); } } sayHi(); |
firefox會彈出"Hi!",其他的瀏覽器會彈出"Yo!"。
這里firefox會出現(xiàn)這種情況是因為firefox會把if里面的function定義當(dāng)作表達式來處理。
MDN的原文
Functions can be conditionally declared. That is, a function definition can be nested within an if statement. Technically, such declarations are not actually function declarations; they are function expressions.
所以這種不兼容的方法不要使用。

TA貢獻1815條經(jīng)驗 獲得超6個贊
我來說一下,其實 這個函數(shù)等于這樣
function sayHi(){
alert('hi')
}
function sayHi(){
alert('Yo')
}
你寫的第一個無效那個,等于分開寫,下面的就會把上面的覆蓋掉,只顯示下面的了

TA貢獻1784條經(jīng)驗 獲得超9個贊
實在不明白你這段代碼的目的。
如果你只是需要在不同的condition提示不同的alert, 那么只需要如下就可以了。
if(condition){
alert("Hi!");
}else{
alert("Yo!");
}
如果你需要在不同的condition定義不同的SayHi()函數(shù)。那么很明顯,只有下面的才是正確的。
上面的做法不管從任何角度看都是亂來。 如果JS支持把局部定義默認為全局的(PHP可以),那么上面這樣就叫重復(fù)定義。如果JS不支持把局部當(dāng)全局用,那么你上面的做法跳出if/else的范圍,此函數(shù)為未定義(不存在).

TA貢獻1817條經(jīng)驗 獲得超6個贊
當(dāng)然無效了,定義函數(shù)/對象有兩種方式,一般來說效果是差不多,但是也有一點點區(qū)別:
方式1,
1 2 3 4 | //這種定義,瀏覽器首先會把所有的函數(shù)定義先預(yù)留 function sayHi(){ alert("Hi!"); } |
方式2,
1 2 3 4 | //這種定義,瀏覽器運行到這一行,才會定義函數(shù) var sayHi = function(){ alert("Hi!"); } |
添加回答
舉報