定義函數(shù)有兩種方式:一種是函數(shù)聲明药版,一種是函數(shù)表達式。
函數(shù)聲明的方式:是由function關鍵字白魂,然后是函數(shù)名指定函數(shù)的方式汽纤。(FF、Safari福荸、chrome蕴坪、opera都給函數(shù)指定了一個非標準的name屬性,通過這個屬性可以訪問到給定函數(shù)指定的名字敬锐。)
關于函數(shù)聲明背传,有個重要特征就是函數(shù)聲明提升。意思是在執(zhí)行代碼之前台夺,會先讀取函數(shù)聲明径玖。這就意味著函數(shù)執(zhí)行可以放在函數(shù)聲明之前執(zhí)行。
sayHi()
function Sayhi(){
//函數(shù)體
}
函數(shù)表達式的方式:先說一種常見的寫法
var fnName = function() {
//函數(shù)體
}
這種情況下創(chuàng)建的函數(shù)叫做匿名函數(shù)(又叫做拉姆達函數(shù))谒养,匿名函數(shù)的name屬性值為空字符串挺狰。
注意:函數(shù)表達式和其他表達式一樣明郭,在使用前必須賦值,如下(不要這樣去做)
fnName()
var fnName = function Sayhi(){
//函數(shù)體
}
理解函數(shù)提升的關鍵丰泊,就是理解函數(shù)聲明與函數(shù)表達式之間的區(qū)別薯定。
下面舉一個例子:
if(condition){
function say(){
alert(1)
}
}else{
function say(){
alert(2)
}
}
如上寫法,大多數(shù)瀏覽器會返回第二個函數(shù)聲明瞳购,但是FF會在condition為true的時候返回第一個函數(shù)聲明话侄。這樣做是很危險的行為。如果改為以下的寫法就可以了学赛。
var say;
if(condition){
say = function (){
alert(1)
}
}else{
say = function (){
alert(2)
}
}