( function(){…} )()和( function (){…} () )是兩種javascript立即執(zhí)行函數(shù)的常見寫法
最初以為是一個括號包裹匿名函數(shù)韩脑,再在后面加個括號調(diào)用函數(shù)玻粪,最后達到函數(shù)定義后立即執(zhí)行的目 的幌蚊,后來發(fā)現(xiàn)加括號的原因并非如此翻伺。要理解立即執(zhí)行函數(shù)沈跨,需要先理解一些函數(shù)的基本概念。
函數(shù)聲明商叹、函數(shù)表達式、匿名函數(shù)
函數(shù)聲明:function fnName () {…};使用function關(guān)鍵字聲明一個函數(shù)只泼,再指定一個函數(shù)名剖笙,叫函數(shù)聲明。
函數(shù)表達式 var fnName = function () {…};使用function關(guān)鍵字聲明一個函數(shù)请唱,但未給函數(shù)命名弥咪,最后將匿名函數(shù)賦予一個變量,叫函數(shù)表達式十绑,這是最常見的函數(shù)表達式語法形式聚至。
匿名函數(shù):function () {}; 使用function關(guān)鍵字聲明一個函數(shù),但未給函數(shù)命名本橙,所以叫匿名函數(shù)扳躬,匿名函數(shù)屬于函數(shù)表達式,匿名函數(shù)有很多作用甚亭,賦予一個變量則創(chuàng)建函數(shù)贷币,賦予一個事件則成為事件處理程序或創(chuàng)建閉包等等。
函數(shù)聲明和函數(shù)表達式不同之處:
一亏狰、Javascript引擎在解析javascript代碼時會 "函數(shù)聲明提升" (Function declaration Hoisting)當(dāng)前執(zhí)行環(huán)境(作用域)上的函數(shù)聲明,而函數(shù)表達式必須等到Javascirtp引擎執(zhí)行到它所在行時,才會從上而下一行一行地解析函數(shù)表達式;
二役纹、函數(shù)表達式后面可以加括號立即調(diào)用該函數(shù),函數(shù)聲明不可以,只能以fnName()形式調(diào)用 。
要在函數(shù)體后面加括號就能立即調(diào)用,則這個函數(shù) 必須是函數(shù)表達式,不能是函數(shù)聲明暇唾。
? 加括號是最安全的做法,因為促脉!辰斋、+、-等運算符還會和函數(shù)的返回值進行運算,有時造成不必要的麻煩瘸味。