什么是自執(zhí)行函數(shù)?

大家好谈喳,我是IT修真院武漢分院第7期的學(xué)員景鑫册烈,一枚正直純潔善良的WEB前端程序員。

1.背景介紹

在詳細(xì)講解自執(zhí)行函數(shù)之前婿禽,我們先來說一下這個(gè)函數(shù)在叫法上的爭(zhēng)議赏僧。實(shí)際上不同的人對(duì)自執(zhí)行函數(shù)的理解不太一樣,第一種理解是扭倾,自執(zhí)行即自動(dòng)執(zhí)行淀零,也就是大家平時(shí)所謂的立即執(zhí)行函數(shù)。

還有一種理解膛壹,即自執(zhí)行函數(shù)是在函數(shù)內(nèi)部執(zhí)行函數(shù)本身驾中,即我們平時(shí)常說的遞歸函數(shù)。不管是哪種理解模聋,我們都沒必要去糾結(jié)叫法上的準(zhǔn)確與否肩民,因?yàn)橄啾扔谧詧?zhí)行函數(shù),立即執(zhí)行函數(shù)和遞歸函數(shù)這兩種叫法是我們更加熟悉的链方,實(shí)際上平時(shí)也很少會(huì)看到自執(zhí)行函數(shù)這種叫法持痰。立即執(zhí)行函數(shù)和遞歸函數(shù)都很重要,因此今天打算對(duì)兩種函數(shù)都做一下介紹祟蚀。

2.知識(shí)剖析

知識(shí)點(diǎn)1:直接在函數(shù)后面加()就可以立即執(zhí)行嗎工窍?在函數(shù)聲明后面加括號(hào)為什么會(huì)報(bào)錯(cuò)?

知識(shí)點(diǎn)2:如何實(shí)現(xiàn)立即執(zhí)行函數(shù)

知識(shí)點(diǎn)3:遞歸函數(shù)的幾種用法

3.常見問題

對(duì)函數(shù)聲明以及函數(shù)表達(dá)式理解不夠深入

不知道立即執(zhí)行函數(shù)的用法

4.解決方案

見demo

5.編碼實(shí)戰(zhàn)

5.1對(duì)于函數(shù)表達(dá)式前酿,在后面加括號(hào)即可以讓函數(shù)立即執(zhí)行患雏;例如下面這個(gè)函數(shù),至于為什么加了括號(hào)就可以立即執(zhí)行薪者,我們可以這么理解纵苛,就是像fn1();這樣寫的話言津,函數(shù) 可以立即執(zhí)行是沒問題的攻人,我們?cè)诮?jīng)常會(huì)用到,那么對(duì)于函數(shù)表達(dá)式來說悬槽,fn1就是對(duì)后面的匿名函數(shù)的一個(gè)引用怀吻,因此在后面的匿名函數(shù)后直接加括號(hào),自然也就可以立即執(zhí)行

函數(shù)表達(dá)式立即執(zhí)行

5.2但是對(duì)于下面這個(gè)函數(shù)初婆,如果直接加()就會(huì)報(bào)錯(cuò)蓬坡;如果按照上面的思路去理解猿棉,在匿名函數(shù)后面直接加上()應(yīng)該是可以立即執(zhí)行的,但是下面這個(gè)函數(shù)之所以會(huì)報(bào)錯(cuò)屑咳,而且會(huì)報(bào)兩個(gè)錯(cuò)誤萨赁,是因?yàn)閖s引擎在解析js代碼的時(shí)候,遇到以function打頭的函數(shù)會(huì)當(dāng)做函數(shù)聲明兆龙,然后會(huì)檢查語(yǔ)法錯(cuò)誤杖爽,那么第一個(gè)括號(hào)處的語(yǔ)法錯(cuò)誤在于函數(shù)聲明是必須要有函數(shù)名字的,而()前面沒有所以報(bào)錯(cuò)紫皇;第二個(gè)括號(hào)處的語(yǔ)法錯(cuò)誤在于函數(shù)聲明到第二個(gè)花括號(hào)處慰安,就已經(jīng)算是結(jié)尾了,后面的()會(huì)被當(dāng)作分組操作符聪铺,這個(gè)()實(shí)際上已經(jīng)和函數(shù)聲明沒關(guān)系了化焕,但是既然有了分組操作符,那就要有表達(dá)式铃剔,不然會(huì)報(bào)錯(cuò)撒桨;


函數(shù)聲明想要立即執(zhí)行,會(huì)報(bào)錯(cuò)

按照上面的分析番宁,我們?nèi)绻诘谝粋€(gè)()前面加上函數(shù)名稱元莫,在第二個(gè)()里面加入表達(dá)式赖阻,那么久不會(huì)報(bào)錯(cuò)了蝶押,我們來看一下效果


改掉語(yǔ)法錯(cuò)誤以后的函數(shù)聲明

可以看到修改了那兩處的問題以后,報(bào)錯(cuò)消失了火欧,但是這個(gè)時(shí)候函數(shù)并沒有執(zhí)行棋电,原因上面也已經(jīng)提到了,就是一旦被當(dāng)作函數(shù)聲明苇侵,那么到花括號(hào)處就算為止了赶盔,后面的()就只當(dāng)作一個(gè)分組操作符,和函數(shù)沒有任何關(guān)系了

5.3那么想讓這種匿名函數(shù)直接執(zhí)行應(yīng)該怎么辦呢榆浓,其實(shí)很簡(jiǎn)單于未,就是在function前面加上一些操作符,這樣js引擎在解析的時(shí)候就不會(huì)把它當(dāng)成是函數(shù)聲明了


推薦使用的方法陡鹃,看起來比較具有結(jié)構(gòu)性


也是一種常用的寫法


兩種寫法也可以讓函數(shù)立即執(zhí)行烘浦,不過不常用

5.4以下為最簡(jiǎn)單的遞歸函數(shù),即在函數(shù)內(nèi)部調(diào)用函數(shù)本身萍鲸。


最簡(jiǎn)單的遞歸函數(shù)

這種函數(shù)有個(gè)問題闷叉,就是當(dāng)函數(shù)被其他變量引用,而原函數(shù)名又被設(shè)置為空對(duì)象后脊阴,遞歸函數(shù)就會(huì)報(bào)錯(cuò)


此時(shí)fun為空握侧,但gun函數(shù)內(nèi)部還會(huì)調(diào)用fun蚯瞧,這樣就會(huì)導(dǎo)致報(bào)錯(cuò)

5.5利用argumens.callee來解決這個(gè)問題,argumens.callee指向當(dāng)前的函數(shù)品擎;


此時(shí)無(wú)論fun是否為空對(duì)象埋合,內(nèi)部調(diào)用的始終是當(dāng)前的函數(shù)本身

但是這個(gè)方法在嚴(yán)格模式下是不可使用的,因此還不夠完美

5.6利用函數(shù)表達(dá)式構(gòu)造遞歸函數(shù)


f函數(shù)不會(huì)隨著fun的改變而改變萄传,而且在嚴(yán)格模式下可用

6.拓展思考

立即執(zhí)行函數(shù)有哪些用處饥悴?

立即執(zhí)行函數(shù)有很多用處,下面舉一個(gè)例子:

在下面這個(gè)函數(shù)中盲再,result是一個(gè)函數(shù)數(shù)組西设,希望達(dá)到的效果應(yīng)該執(zhí)行數(shù)組中的任何一個(gè)函數(shù),得到的值都應(yīng)該和該函數(shù)在數(shù)組中的索引值是一樣的答朋,但是實(shí)際情況是所有函數(shù)執(zhí)行后得到的值都是10贷揽。之所以會(huì)這樣是因?yàn)閞esult數(shù)組取值的時(shí)候,是通過內(nèi)部函數(shù)去返回外部變量i的值來取得的梦碗,由于內(nèi)部函數(shù)會(huì)創(chuàng)造一個(gè)自己的作用域鏈禽绪,作用域鏈中存放的是i這個(gè)外部變量對(duì)象,這個(gè)變量對(duì)象對(duì)內(nèi)部函數(shù)來說只有一個(gè)洪规,for循環(huán)執(zhí)行完成后的最后的值印屁,即10;

閉包產(chǎn)生的問題

這個(gè)問題可以通過在給result數(shù)組取值外面加立即執(zhí)行函數(shù)來解決斩例,立即執(zhí)行函數(shù)外面的()里面是可以傳參的雄人,下面這個(gè)用法中就是把外部變量i的值通過傳參傳給了num,然后把num的值又傳給了result念赶,這樣最后函數(shù)數(shù)組result中每一個(gè)函數(shù)都是返回當(dāng)時(shí)具體的值础钠,即i當(dāng)時(shí)的值,而不是i最后的值叉谜。


使用立即執(zhí)行函數(shù)傳參來解決這個(gè)問題

7.參考文獻(xiàn)

參考一:湯姆大叔的博客之立即調(diào)用的函數(shù)表達(dá)式?

參考二:Javascript高級(jí)程序設(shè)計(jì)

8.更多討論

函數(shù)這一部分旗吁,從執(zhí)行環(huán)境、作用域鏈停局、函數(shù)聲明函數(shù)表達(dá)式很钓,到閉包、構(gòu)造函數(shù)和原型鏈都是連在一塊的董栽,類似的函數(shù)問題大家都可以一起討論一下

課后問題:

閉包和匿名函數(shù)的區(qū)別码倦?

答:匿名函數(shù)上面已經(jīng)見過了,類似于常用函數(shù)表達(dá)式中裆泳,function后面直接接一個(gè)()叹洲,沒有函數(shù)名字,即為匿名函數(shù)工禾;閉包是在某個(gè)函數(shù)內(nèi)部的函數(shù)运提,由于閉包的作用域鏈包含有外部函數(shù)的變量對(duì)象蝗柔,因此它可以訪問外部函數(shù)變量,這個(gè)叫閉包

視頻鏈接:


【武漢-第182期】什么是自執(zhí)行函數(shù)民泵?_騰訊視頻

PPT鏈接:PPT?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末癣丧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子栈妆,更是在濱河造成了極大的恐慌胁编,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳞尔,死亡現(xiàn)場(chǎng)離奇詭異嬉橙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寥假,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門市框,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糕韧,你說我怎么就攤上這事枫振。” “怎么了萤彩?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵粪滤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我雀扶,道長(zhǎng)杖小,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任怕吴,我火速辦了婚禮窍侧,結(jié)果婚禮上县踢,老公的妹妹穿的比我還像新娘转绷。我一直安慰自己,他們只是感情好硼啤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布议经。 她就那樣靜靜地躺著,像睡著了一般谴返。 火紅的嫁衣襯著肌膚如雪煞肾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天嗓袱,我揣著相機(jī)與錄音籍救,去河邊找鬼。 笑死渠抹,一個(gè)胖子當(dāng)著我的面吹牛蝙昙,可吹牛的內(nèi)容都是我干的闪萄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼奇颠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼败去!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烈拒,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圆裕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荆几,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吓妆,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年吨铸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耿战。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焊傅,死狀恐怖剂陡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狐胎,我是刑警寧澤鸭栖,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站握巢,受9級(jí)特大地震影響晕鹊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暴浦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一溅话、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歌焦,春花似錦飞几、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纷铣,卻和暖如春卵史,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搜立。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工以躯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啄踊。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓忧设,卻偏偏與公主長(zhǎng)得像色鸳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子见转,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容