定義函數(shù)有兩種方式:一種是函數(shù)聲明,一種是函數(shù)表達(dá)式。
函數(shù)聲明的方式:是由function關(guān)鍵字,然后是函數(shù)名指定函數(shù)的方式。(FF、Safari、chrome、opera都給函數(shù)指定了一個(gè)非標(biāo)準(zhǔn)的name屬性,通過(guò)這個(gè)屬性可以訪問(wèn)到給定函數(shù)指定的名字。)
關(guān)于函數(shù)聲明,有個(gè)重要特征就是函數(shù)聲明提升。意思是在執(zhí)行代碼之前,會(huì)先讀取函數(shù)聲明。這就意味著函數(shù)執(zhí)行可以放在函數(shù)聲明之前執(zhí)行。
sayHi()
function Sayhi(){
//函數(shù)體
}
函數(shù)表達(dá)式的方式:先說(shuō)一種常見(jiàn)的寫(xiě)法
var fnName = function() {
//函數(shù)體
}
這種情況下創(chuàng)建的函數(shù)叫做匿名函數(shù)(又叫做拉姆達(dá)函數(shù)),匿名函數(shù)的name屬性值為空字符串。
注意:函數(shù)表達(dá)式和其他表達(dá)式一樣,在使用前必須賦值,如下(不要這樣去做)
fnName()
var fnName = function Sayhi(){
//函數(shù)體
}
理解函數(shù)提升的關(guān)鍵,就是理解函數(shù)聲明與函數(shù)表達(dá)式之間的區(qū)別。
下面舉一個(gè)例子:
if(condition){
function say(){
alert(1)
}
}else{
function say(){
alert(2)
}
}
如上寫(xiě)法,大多數(shù)瀏覽器會(huì)返回第二個(gè)函數(shù)聲明,但是FF會(huì)在condition為true的時(shí)候返回第一個(gè)函數(shù)聲明。這樣做是很危險(xiǎn)的行為。如果改為以下的寫(xiě)法就可以了。
var say;
if(condition){
say = function (){
alert(1)
}
}else{
say = function (){
alert(2)
}
}