JS立即執(zhí)行函數(shù)

? ? 很多時(shí)候我們?cè)趈s中定義一個(gè)函數(shù)后拌汇,只需要執(zhí)行該函數(shù)一次缚甩,比如數(shù)據(jù)初始化函數(shù)谱净;這種情況下,定義一個(gè)函數(shù)就會(huì)浪費(fèi)內(nèi)存空間擅威,這是我們可以使用立即執(zhí)行函數(shù)(Immediately-Invoked Function Expression 即IIFE)壕探。

函數(shù)調(diào)用

方式1:

? ? 定義一個(gè)函數(shù)后,我們可以通過(guò)()進(jìn)行調(diào)用郊丛,如下:

????????????function fn(){}

????????????fn();

? ? 那么我們是否可以通過(guò)如下的方式直接調(diào)用函數(shù)呢李请?

? ? ? ? ? ? function fn(){}();? ? ? //SyntaxError: Unexpected token )

? ? 結(jié)果是報(bào)語(yǔ)法錯(cuò)誤瞧筛,因?yàn)檎Z(yǔ)句是無(wú)法執(zhí)行的,所以js解析器在解析時(shí)捻艳,把該語(yǔ)句解析成了一個(gè)函數(shù)和一個(gè)分組操作符驾窟,如下:

? ? ? ? ? ? function fn(){}

? ? ? ? ? ? ();

? ? 而分組操作符內(nèi)不能為空,所以報(bào)了語(yǔ)法錯(cuò)誤认轨。

?方式2:

? ? 另一個(gè)在函數(shù)定義和調(diào)用的方式如下:

? ? ? ? ? ? var fn = function(){};

? ? ? ? ? ? fn();

? ? 可以看出绅络,匿名函數(shù)賦值給一個(gè)變量后,也可以作為函數(shù)被調(diào)用嘁字,那么是否可以通過(guò)如下方式直接調(diào)用函數(shù)呢恩急?

? ? ? ? ? ? function(){}();? ? ? //SyntaxError: Unexpected token (

? ? 結(jié)果依然是報(bào)語(yǔ)法錯(cuò)誤,原因是js解析時(shí)纪蜒,除非顯示的將函數(shù)定義為表達(dá)式衷恭,否則解析器都會(huì)將其當(dāng)做函數(shù)申明,而上面的語(yǔ)句就是將其當(dāng)做了函數(shù)申明纯续,而函數(shù)聲明必須要有函數(shù)名随珠,故解析都( 括號(hào)后報(bào)錯(cuò)。

實(shí)現(xiàn)立即調(diào)用

? ? 通過(guò)上面的分析可以看出猬错,一個(gè)函數(shù)如果想要立即執(zhí)行窗看,那么就必須顯示的將函數(shù)定義為表達(dá)式的形式。故可以通過(guò)如下的一些方式倦炒,定義一個(gè)立即執(zhí)行函數(shù):

? ? 1. (function(){}())? //最推薦的方式显沈,外面的括號(hào)將內(nèi)部的函數(shù)顯示的定義為函數(shù)表達(dá)式

? ? 2. (function(){})()? ? //完全等同于以上的方式

? ? 3. !function(){}();? // 通過(guò)!元素符將函數(shù)顯示的定義為表達(dá)式逢唤,然后執(zhí)行拉讯,同理:+,- 也可以

? ? 4. var fn = function(){}();? //通過(guò)賦值運(yùn)算符將函數(shù)顯示的定義為表達(dá)式鳖藕,然后執(zhí)行

總之魔慷,實(shí)現(xiàn)函數(shù)立即執(zhí)行的方式很多,但有的會(huì)與函數(shù)的返回值進(jìn)行運(yùn)行吊奢,如:盖彭!,+页滚,- ;為了避免這種麻煩铺呵,我們通常采用1和2兩種方式定義裹驰。

作用

? ? 立即執(zhí)行函數(shù)的作用:

? ? ? ? 1. 解決閉包中的狀態(tài)保存問(wèn)題;(常見(jiàn)的一個(gè)函數(shù)內(nèi)部返回多個(gè)函數(shù)片挂,調(diào)用這些函數(shù)幻林,打印父函數(shù)內(nèi)部變量的問(wèn)題)

? ? ? ? 2. 模塊化開(kāi)發(fā)中贞盯,定義私有變量,防止污染全局沪饺;

? ? ? ? 3. 初始化數(shù)據(jù)和頁(yè)面

注意:函數(shù)表達(dá)式定義的函數(shù)躏敢,函數(shù)名外部無(wú)法引用,如下:

? 1.? var fn = function f(){};

? ??? console.log(typeof f);??//打印undefined整葡,函數(shù)表達(dá)式的函數(shù)名f在外部是訪問(wèn)不到的

? ?2. if(function f(){}){

? ? ? ? ? ? console.log(typeof f);? //同理件余,打印undefined,if語(yǔ)句中的函數(shù)解析為函數(shù)表達(dá)式遭居,函數(shù)名f在外部是訪問(wèn)不到的

????????}

? ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啼器,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俱萍,更是在濱河造成了極大的恐慌端壳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枪蘑,死亡現(xiàn)場(chǎng)離奇詭異损谦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)岳颇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門照捡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人赦役,你說(shuō)我怎么就攤上這事麻敌。” “怎么了掂摔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵术羔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乙漓,道長(zhǎng)级历,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任叭披,我火速辦了婚禮寥殖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涩蜘。我一直安慰自己嚼贡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布同诫。 她就那樣靜靜地躺著粤策,像睡著了一般。 火紅的嫁衣襯著肌膚如雪误窖。 梳的紋絲不亂的頭發(fā)上叮盘,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天秩贰,我揣著相機(jī)與錄音,去河邊找鬼柔吼。 笑死毒费,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的愈魏。 我是一名探鬼主播觅玻,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝌戒!你這毒婦竟也來(lái)了串塑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后捐川,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傻昙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彩扔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妆档。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虫碉,靈堂內(nèi)的尸體忽然破棺而出贾惦,到底是詐尸還是另有隱情,我是刑警寧澤敦捧,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布须板,位于F島的核電站,受9級(jí)特大地震影響兢卵,放射性物質(zhì)發(fā)生泄漏习瑰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一秽荤、第九天 我趴在偏房一處隱蔽的房頂上張望甜奄。 院中可真熱鬧,春花似錦窃款、人聲如沸课兄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)第喳。三九已至,卻和暖如春踱稍,著一層夾襖步出監(jiān)牢的瞬間曲饱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工珠月, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扩淀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓啤挎,卻偏偏與公主長(zhǎng)得像驻谆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庆聘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 引:原文 | 譯文 一種私有變量創(chuàng)建方式胜臊,也是閉包的應(yīng)用之一。 但是伙判,很多時(shí)候象对,我們不需要函數(shù)聲明,不需要后續(xù)的在...
    DHFE閱讀 455評(píng)論 0 0
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)宴抚,也就是一...
    悟名先生閱讀 4,118評(píng)論 0 13
  • 函數(shù)的兩種定義方法:函數(shù)聲明 函數(shù)表達(dá)式 函數(shù)包括四個(gè)部分勒魔,function關(guān)鍵字、函數(shù)名菇曲、圓括號(hào)冠绢、花括號(hào)。期中函...
    8d2855a6c5d0閱讀 1,851評(píng)論 0 3
  • 1.什么是立即執(zhí)行函數(shù)只有表達(dá)式才可以被()符號(hào)執(zhí)行常潮。在了解立即執(zhí)行函數(shù)之前先明確一下函數(shù)聲明弟胀、函數(shù)表達(dá)式及匿名函...
    WangYatao閱讀 355評(píng)論 0 0
  • 每當(dāng)不開(kāi)心的時(shí)候,我都會(huì)點(diǎn)開(kāi)老友記的任意一集喊式,默默看上幾分鐘孵户,就會(huì)心情愉快起來(lái)±В看著劇中人幸福的喜怒哀樂(lè)延届,看劇人也...
    1418domheng閱讀 1,115評(píng)論 2 97