深入理解立即執(zhí)行函數(shù) 2018-04

看過jQuery源碼的人應該知道,jQuery開篇用的就是立即執(zhí)行函數(shù)晰筛。立即執(zhí)行函數(shù)常用于第三方庫,好處在于隔離作用域恩袱,任何一個第三方庫都會存在大量的變量和函數(shù),為了避免變量污染(命名沖突)胶哲,開發(fā)者們想到的解決辦法就是使用立即執(zhí)行函數(shù)畔塔。

1.什么是立即執(zhí)行函數(shù)(IIFE)

在了解立即執(zhí)行函數(shù)之前先明確一下函數(shù)聲明、函數(shù)表達式及匿名函數(shù)的形式,請看:

 function test() {//函數(shù)聲明
   console.log("test"); 
}

var test = function() { console.log("test"); };
//上行代碼即是--函數(shù)表達式,其中等號右邊部分function() { console.log("test"); }即是匿名函數(shù)

//但在程序中澈吨,匿名函數(shù)不能像function() { console.log("test"); } 這樣單獨存在
//除非用立即執(zhí)行的方式把敢,看下一段code

接下來看立即執(zhí)行函數(shù)的兩種常見形式:( function(){…} )()和( function (){…} () ),一個是一個匿名函數(shù)包裹在一個括號運算符中谅辣,后面再跟一個小括號修赞,另一個是一個匿名函數(shù)后面跟一個小括號,然后整個包裹在一個括號運算符中桑阶,這兩種寫法是等價的柏副。要想立即執(zhí)行函數(shù)能做到立即執(zhí)行,要注意兩點蚣录,一是函數(shù)體后面要有小括號()割择,二是函數(shù)體必須是函數(shù)表達式而不能是函數(shù)聲明。請看:

(function(test) {
  console.log(test);
})(123); //輸出123, 使用()運算符

(function(test) {
  console.log(test);
}(1234)); //輸出1234, 使用()運算符

!function(test) {
  console.log(test);
}(12345);  //輸出12345, 使用萎河!運算符

-function(test) {
  console.log(test);
}(123456);  //輸出123456, 使用-運算符

+function(test) {
  console.log(test);
}(1234567);  //輸出1234567, 使用+運算符

var func = function(test) {
  console.log(test);
}(12345678);  //輸出12345678, 使用=運算符

2.使用立即執(zhí)行函數(shù)的好處

通過定義一個匿名函數(shù)荔泳,創(chuàng)建了一個新的函數(shù)作用域,相當于創(chuàng)建了一個“私有”的命名空間虐杯,該命名空間的變量和方法玛歌,不會破壞污染全局的命名空間。此時若是想訪問全局對象厦幅,將全局對象以參數(shù)形式傳進去即可,如jQuery代碼結(jié)構(gòu):

(function (window, undefined) {
//jQuery code
})(window);

其中window即是全局對象慨飘。作用域隔離非常重要确憨,是一個JS框架必須支持的功能,jQuery被應用在成千上萬的JavaScript程序中瓤的,必須確保jQuery創(chuàng)建的變量不能和導入他的程序所使用的變量發(fā)生沖突休弃。


本文結(jié)束

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市圈膏,隨后出現(xiàn)的幾起案子塔猾,更是在濱河造成了極大的恐慌,老刑警劉巖稽坤,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丈甸,死亡現(xiàn)場離奇詭異,居然都是意外死亡尿褪,警方通過查閱死者的電腦和手機睦擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杖玲,“玉大人顿仇,你說我怎么就攤上這事。” “怎么了臼闻?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵鸿吆,是天一觀的道長。 經(jīng)常有香客問我述呐,道長惩淳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任市埋,我火速辦了婚禮黎泣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缤谎。我一直安慰自己抒倚,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布坷澡。 她就那樣靜靜地躺著托呕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪频敛。 梳的紋絲不亂的頭發(fā)上项郊,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音斟赚,去河邊找鬼着降。 笑死,一個胖子當著我的面吹牛拗军,可吹牛的內(nèi)容都是我干的任洞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼发侵,長吁一口氣:“原來是場噩夢啊……” “哼交掏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刃鳄,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盅弛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叔锐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挪鹏,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年愉烙,在試婚紗的時候發(fā)現(xiàn)自己被綠了狰住。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡齿梁,死狀恐怖催植,靈堂內(nèi)的尸體忽然破棺而出肮蛹,到底是詐尸還是另有隱情,我是刑警寧澤创南,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布伦忠,位于F島的核電站,受9級特大地震影響稿辙,放射性物質(zhì)發(fā)生泄漏昆码。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一邻储、第九天 我趴在偏房一處隱蔽的房頂上張望赋咽。 院中可真熱鬧,春花似錦吨娜、人聲如沸脓匿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陪毡。三九已至,卻和暖如春勾扭,著一層夾襖步出監(jiān)牢的瞬間毡琉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工妙色, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桅滋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓身辨,卻偏偏與公主長得像丐谋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子栅表,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355