函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
function命令聲明的代碼區(qū)塊,就是一個函數(shù)墓律。function命令后面是函數(shù)名膀估,函數(shù)名后面是一對圓括號,里面是傳入函數(shù)的參數(shù)耻讽。函數(shù)體放在大括號里面察纯。
function print(s) {
console.log(s);
}
上面的代碼命名了一個print函數(shù),以后使用print()這種形式针肥,就可以調(diào)用相應(yīng)的代碼饼记。這叫做函數(shù)的聲明(Function Declaration)。
除了用function命令聲明函數(shù)慰枕,還可以采用變量賦值的寫法握恳。
var print = function(s) {
console.log(s);
};
這種寫法將一個匿名函數(shù)賦值給變量。這時捺僻,這個匿名函數(shù)又稱函數(shù)表達(dá)式(Function Expression),因?yàn)橘x值語句的等號右側(cè)只能放表達(dá)式。
區(qū)別:函數(shù)表達(dá)式通過賦值來聲明函數(shù)匕坯,聲明完畢后要加上分號表示該句結(jié)束束昵,在表達(dá)式執(zhí)行完后,函數(shù)才存在并可被調(diào)用葛峻。而函數(shù)聲明與執(zhí)行順序無關(guān)锹雏。
什么是變量的聲明前置?什么是函數(shù)的聲明前置
JavaScript引擎將函數(shù)名視同變量名术奖,所以采用function命令聲明函數(shù)時礁遵,整個函數(shù)會像變量聲明一樣,被提升到代碼頭部采记。所以佣耐,下面的代碼不會報錯。
f();
function f() {}
arguments 是什么
由于JavaScript允許函數(shù)有不定數(shù)目的參數(shù)唧龄,所以我們需要一種機(jī)制兼砖,可以在函數(shù)體內(nèi)部讀取所有參數(shù)。這就是arguments對象的由來既棺。
arguments對象包含了函數(shù)運(yùn)行時的所有參數(shù)讽挟,arguments[0]就是第一個參數(shù),arguments[1]就是第二個參數(shù)丸冕,以此類推耽梅。這個對象只有在函數(shù)體內(nèi)部,才可以使用胖烛。
var f = function(one) {
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
}
f(1, 2, 3)
// 1
// 2
// 3
函數(shù)的"重載"怎樣實(shí)現(xiàn)
在 JS 中
沒有重載! 同名函數(shù)會覆蓋眼姐。 但可以在函數(shù)體針對不同的參數(shù)調(diào)用執(zhí)行相應(yīng)的邏輯。
立即執(zhí)行函數(shù)表達(dá)式是什么洪己?有什么作用
有時妥凳,我們需要在定義函數(shù)之后,立即調(diào)用該函數(shù)答捕。這時逝钥,你不能在函數(shù)的定義之后加上圓括號,這會產(chǎn)生語法錯誤拱镐。
function(){ /* code */ }();
// SyntaxError: Unexpected token (
產(chǎn)生這個錯誤的原因是艘款,function這個關(guān)鍵字即可以當(dāng)作語句,也可以當(dāng)作表達(dá)式沃琅。
// 語句
function f() {}
// 表達(dá)式
var f = function f() {}
為了避免解析上的歧義哗咆,JavaScript引擎規(guī)定,如果function關(guān)鍵字出現(xiàn)在行首益眉,一律解釋成語句晌柬。因此姥份,JavaScript引擎看到行首是function關(guān)鍵字之后,認(rèn)為這一段都是函數(shù)的定義年碘,不應(yīng)該以圓括號結(jié)尾澈歉,所以就報錯了。
解決方法就是不要讓function出現(xiàn)在行首屿衅,讓引擎將其理解成一個表達(dá)式埃难。最簡單的處理,就是將其放在一個圓括號里面涤久。
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();
上面兩種寫法都是以圓括號開頭涡尘,引擎就會認(rèn)為后面跟的是一個表示式,而不是函數(shù)定義語句响迂,所以就避免了錯誤考抄。這就叫做“立即調(diào)用的函數(shù)表達(dá)式”(Immediately-Invoked Function Expression),簡稱IIFE栓拜。
通常情況下座泳,只對匿名函數(shù)使用這種“立即執(zhí)行的函數(shù)表達(dá)式”。它的目的有兩個:一是不必為函數(shù)命名幕与,避免了污染全局變量挑势;二是IIFE內(nèi)部形成了一個單獨(dú)的作用域,可以封裝一些外部無法讀取的私有變量啦鸣。避免了污染全局變量潮饱。