立即調(diào)用的函數(shù)表達式(IIFE)

愛總結(jié)挽唉,愛搬磚,愛生活

引言

偶然之間看到一個問題定踱,問題是這樣的:

(function() {}());
(function() {})();

上面這兩種寫法有沒有什么區(qū)別棍潘?
打眼一看這個問題不太好回答,這說明了一個問題崖媚,我對這類立即調(diào)用的函數(shù)表達式還不熟悉亦歉,這個時候應(yīng)該去百度看看大家怎么理解立即調(diào)用的函數(shù)表達式。

心得

  • 立即調(diào)用的函數(shù)表達式(在這之前我一直稱呼它為立即執(zhí)行函數(shù)畅哑,經(jīng)過此番探索更正了之前不合理的叫法)
  • 立即調(diào)用的函數(shù)表達式的作用:
    • 不必為函數(shù)命名肴楷,避免污染全局作用域;
    • 立即調(diào)用的函數(shù)表達式內(nèi)部形成了一個單獨的作用域荠呐,可以封裝一些外部無法讀取的私有變量和方法赛蔫。

回顧

先從函數(shù)的定義和使用說起

// 函數(shù)聲明
function foo() {
      console.log('foo')
}

// 函數(shù)表達式
var bar = function() {
  console.log('bar')
}

// 調(diào)用
foo()
bar()
  • 上述兩種方式是開發(fā)中常用的函數(shù)定義和調(diào)用方式,回憶一下這兩種定義函數(shù)的方式泥张;
    • 函數(shù)聲明是會發(fā)生函數(shù)提升的呵恢,允許在定義之前使用
    • 函數(shù)表達是不會發(fā)生函數(shù)提升,是不允許在定義之前使用的圾结,函數(shù)表達是可以是一個匿名函數(shù)(上面這樣的)瑰剃,也可以是一個命名函數(shù)(下面這樣)
    // 函數(shù)表達式
    var rn = function rn() {
      console.log('rn')
    }
    
  • 關(guān)于函數(shù)定義的回顧到此為止,接下來探究立即調(diào)用的函數(shù)表達式

立即調(diào)用的函數(shù)表達式

  • 文章開頭給出的兩種寫法
(function() {}());
(function() {})();
  • 要知道這兩種寫法有沒有區(qū)別筝野,那就得先弄清楚為什么會這樣寫晌姚,添上一對括號的作用是什么粤剧?不加這對括號可不可以?

括號的作用

函數(shù)定義后立即調(diào)用的解決方法挥唠,就是不要讓function出現(xiàn)在行首抵恋,讓引擎將其理解成一個表達式。最簡單的處理宝磨,就是將其放在一個圓括號里面弧关。

JavaScript語言基礎(chǔ)教程 --阮一峰

  • 總結(jié)一下前面兩段話的意思:要讓函數(shù)定義后能被立即調(diào)用,就是要讓代碼被當(dāng)作表達式解析唤锉,一種解決方法就是加圓括號世囊;
  • 既然括號的作用只是讓代碼在解析時被解析成表達式,所以文章開頭提到的兩種寫法是沒有區(qū)別的窿祥,不過(function() {}())這種寫法更多的被推薦株憾。

不加括號可不可以?

為了避免解析的歧義晒衩,JavaScript 規(guī)定嗤瞎,如果function關(guān)鍵字出現(xiàn)在行首,一律解釋成語句听系。因此贝奇,引擎看到行首是function關(guān)鍵字之后,認為這一段都是函數(shù)的定義靠胜,不應(yīng)該以圓括號結(jié)尾掉瞳,所以就報錯了。

JavaScript語言基礎(chǔ)教程 --阮一峰

  • 針對文章開頭的兩種寫法不加括號是不可以的髓帽,當(dāng)然還有更多的方法實現(xiàn)函數(shù)定義是就調(diào)用菠赚,這些方式都是被允許的,使用了不同的方式讓一個語句變成表示式郑藏,這也可以理解為什么叫它立即調(diào)用的函數(shù)表達式
var rn = function rn() { console.log('rn') }();

true && function(){ console.log(1) }();

0, function(){ console.log(2) }();

// 這種方式是被推薦的
!function () { console.log(3) }();

~function () { console.log(4) }();

-function () { console.log(5) }();

+function () { console.log(6) }();

注意:(function() {}())(function() {})()使用這兩種寫法時瘩欺,代碼所在的上一行代碼結(jié)束必須有分號必盖,或者寫成這個樣子;(function() {}());(function() {})()俱饿。

使用場景

  • 封裝特定功能的模塊歌粥,起初JQuery就是使用的這種方式;
  • 還記得這個案例嗎
<button class="btn">0</button>
<button class="btn">1</button>
<button class="btn">2</button>
<button class="btn">3</button>

<script>
  var btns = document.getElementsByClassName('btn')
  for(var i = 0; i < btns.length; i++) {
    btns[i].onclick = function() {
      console.log(i);
    }
  }
</script>
  • 上面這個案例中在點擊任意按鈕的時候打印的都是4拍埠,原因不必再做解釋(使用let聲明i變量也可以解決這個問題)失驶,現(xiàn)在咱們用立即調(diào)用的函數(shù)表達式讓點擊按鈕打印不同的值;
// 只貼出了兩種解決方式的js代碼
// 第一種解決方式
var btns = document.getElementsByClassName('btn')
  for(var i = 0; i < btns.length; i++) {
    btns[i].onclick = (function(i) {
      return function() {
        console.log(i)
      }
    }(i))
  }

// 第二種解決方式
var btns = document.getElementsByClassName('btn')
for(var i = 0; i < btns.length; i++) {
  (function(i) {
    btns[i].onclick = function() {
      console.log(i)
    }
  }(i))
}

demo鏈接

參考文章

愛總結(jié)枣购,愛搬磚嬉探,愛生活

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末擦耀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涩堤,更是在濱河造成了極大的恐慌眷蜓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胎围,死亡現(xiàn)場離奇詭異吁系,居然都是意外死亡,警方通過查閱死者的電腦和手機白魂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門汽纤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人福荸,你說我怎么就攤上這事冒版。” “怎么了逞姿?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵辞嗡,是天一觀的道長。 經(jīng)常有香客問我滞造,道長续室,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任谒养,我火速辦了婚禮挺狰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘买窟。我一直安慰自己囊骤,他們只是感情好茫经,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般坤次。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上期犬,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天叁巨,我揣著相機與錄音,去河邊找鬼吞杭。 笑死盏浇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芽狗。 我是一名探鬼主播绢掰,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了滴劲?” 一聲冷哼從身側(cè)響起攻晒,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哑芹,沒想到半個月后炎辨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡聪姿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年碴萧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片末购。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡破喻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盟榴,到底是詐尸還是另有隱情曹质,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布擎场,位于F島的核電站羽德,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏迅办。R本人自食惡果不足惜宅静,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望站欺。 院中可真熱鬧姨夹,春花似錦、人聲如沸矾策。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贾虽。三九已至逃糟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榄鉴,已是汗流浹背履磨。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留庆尘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓巷送,卻偏偏與公主長得像驶忌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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