在了解立即執(zhí)行函數(shù)之前,應該需要了解幾個關(guān)于函數(shù)的概念捞镰。1:函數(shù)聲明狮含;2:函數(shù)表達式;3:匿名函數(shù)曼振。
function? testA(){
}几迄;此為函數(shù)聲明;
var? testA = function (){
}冰评;用定義變量的寫法來寫映胁,這句話意思是定義一個函數(shù),賦值于testA甲雅,這叫函數(shù)表達式解孙;
function? (){
};聲明了函數(shù)抛人,但是沒有取名弛姜,此為匿名函數(shù)。
現(xiàn)在回到立即執(zhí)行函數(shù)的概念妖枚。
立即執(zhí)行函數(shù)常見兩種寫法:
1: (function (){
}() );
2:(function (){
} )();
兩種中寫法中()的作用就是立即執(zhí)行符號廷臼,通過這個聯(lián)想到正常寫法和立即執(zhí)行函數(shù)寫法的區(qū)別。
因為javascript會對你寫的函數(shù)模塊進行預編譯過程绝页,如果寫的是正常的函數(shù)聲明荠商,在當前環(huán)境下,此函數(shù)會被整體提升续誉,而函數(shù)表達式屬于賦值于變量莱没,變量在這個預編譯過程中僅僅變量名提升,后面的值不會提升酷鸦,只有等待代碼一行一行解析到它饰躲,這是函數(shù)表達式和函數(shù)函數(shù)聲明的不同。
更重要的一點臼隔,函數(shù)聲明只能通過函數(shù)名調(diào)用嘹裂,而函數(shù)表達式可以通過后面加()立即執(zhí)行此函數(shù)。
1:var a = function(){
? console.log(‘a(chǎn)bc’)
}躬翁;
2:var a = function(){
? console.log(‘a(chǎn)bc’)
}()焦蘑;
以上兩種寫法中1僅僅給變量a賦值盯拱,賦予了一個函數(shù)表達式盒发,且此函數(shù)表達式未被執(zhí)行例嘱;2中在函數(shù)結(jié)尾加了執(zhí)行符號,則此函數(shù)表達式立即執(zhí)行宁舰,且所有能被執(zhí)行符號執(zhí)行的表達式拼卵,就放棄了這個函數(shù)了,是無法通過函數(shù)名調(diào)用內(nèi)容的蛮艰,例如上述例子中腋腮,如若給函數(shù)定義一個名稱,且加了執(zhí)行符號壤蚜,會打印出abc即寡,但是無法通過這個名稱來執(zhí)行函數(shù)了。