摘要:你需要明白的原理,我簡單說一下這是定義,定義只是讓解釋器知道其存在,但是不會運行。這是語句,解釋器遇到語句是會運行它的。
在SF上看到這樣一個問題,我覺得問得很好,所以弄成文章收集了。
沒有區(qū)別。
你需要明白 IIFE 的原理,我簡單說一下:
function foo() {...} // 這是定義,Declaration;定義只是讓解釋器知道其存在,但是不會運行。 foo(); // 這是語句,Statement;解釋器遇到語句是會運行它的。
IIFE 并非必須,傳統(tǒng)一點可以這么寫:
function foo() {...} foo();
那么為什么要 IIFE?
傳統(tǒng)的方法啰嗦,定義和執(zhí)行分開寫;
傳統(tǒng)的方法直接污染全局命名空間(瀏覽器里的 global 對象,如 window)
于是,開發(fā)者們想找一個可以解決以上問題的寫法。那么像下面這么寫行不行呢?
function foo(...){}();
當然是不能,但是為什么呢?因為 function foo(...){} 這個部分只是一個聲明,對于解釋器來說,就好像你寫了一個字符串 "function foo(...){}",它需要使用解析函數(shù),比如eval() 來執(zhí)行它才可以。所以把 () 直接放在聲明后面是不會執(zhí)行,這是錯誤的語法。
如何把它變得正確?說起來也簡單,只要把 聲明 變成 表達式(Expression) 就可以了。
實際上轉(zhuǎn)變表達式的辦法還是很多的,最常見的辦法是把函數(shù)聲明用一對 () 包裹起來,于是就變成了:
(function foo() {...}) // 這里是故意換行,實際上可以和下面的括號連起來 ();
這就等價于:
var foo = function () {...}; // 這就不是定義,而是表達式了。 foo();
但是之前我們說不行的那個寫法,其實也可以直接用括號包起來,這也是一種等價的表達式:
(function foo(){...}());
所以答案是:木有區(qū)別~
另外,剛才說過轉(zhuǎn)變表達式的方式很多,的確還有很多別的寫法,比如:
!function foo() {...}();
或者
+function foo() {...}();
這些都可以。
我個人挺偏愛用 void 來轉(zhuǎn)變表達式,因為此關(guān)鍵字不會有返回值。不過這一點真的沒有什么要緊的,就當我“龜毛”好了……
void function () { // 這里是真正需要的代碼 }();
OK,所謂不去污染全局命名空間,是因為 IIFE 創(chuàng)建了一個新的函數(shù)作用域,你真正的業(yè)務(wù)代碼被封裝在其中,自然就不會觸碰到全局對象了。如果你需要全局對象,那就 pass 給 IIFE:
void function (global) { // 在這里,global 就是全局對象了 }(this) // 在瀏覽器里,this 就是 window 對象
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85998.html
摘要:匿名函數(shù)是不能單獨寫的,所以就提不上立即執(zhí)行了。六立即執(zhí)行函數(shù)在閉包中的應(yīng)用立即執(zhí)行函數(shù)能配合閉包保存狀態(tài)。來看下上節(jié)內(nèi)容中閉包的例子現(xiàn)在,我們來利用立即執(zhí)行函數(shù)來簡化它第一個匿名函數(shù)執(zhí)行完畢后,返回了第二個匿名函數(shù)。 前面的閉包中,提到與閉包相似的立即執(zhí)行函數(shù),感覺兩者還是比較容易弄混吧,嚴格來說(因為犀牛書和高程對閉包的定義不同),立即執(zhí)行函數(shù)并不屬于閉包,它不滿足閉包的三個條件。...
摘要:模塊化里的和閉包與立即執(zhí)行函數(shù)的使用這篇文章記錄我寫在線個人簡歷過程中學(xué)習(xí)的知識完整代碼暫未完成預(yù)覽地址輪播組件的使用英文官網(wǎng)中文網(wǎng)使用方法模塊化學(xué)習(xí)寫代碼的方法抄運行修改模塊化把對應(yīng)功能放到塊里面這個塊可以是文件或者或者別的等等立即執(zhí) 模塊化、MVC里的V和C、閉包與立即執(zhí)行函數(shù)的使用 這篇文章記錄我寫在線個人簡歷過程中學(xué)習(xí)的知識完整代碼(暫未完成)預(yù)覽地址 輪播Swiper組件的使...
摘要:最近在寫代碼時遇到了閉包,其中閉包又和立即執(zhí)行函數(shù)有點關(guān)系,于是牽扯除了函數(shù)聲明以及函數(shù)表達式,我感覺中文的很多文章寫的不太好,查閱了的指南和這篇關(guān)于的文章,覺得寫的很好,整合一下。函數(shù)聲明和函數(shù)表達式。 最近在寫代碼時遇到了閉包,其中閉包又和立即執(zhí)行函數(shù)(immediately invoked function expression, aka IIFE)有點關(guān)系,于是牽扯除了函數(shù)聲明...
摘要:一般沒有問題,但是,建議在自己寫的立即執(zhí)行函數(shù)前加分號,這樣可以有效地與前面代碼進行隔離。否則,可能出現(xiàn)意想不到的錯誤。自執(zhí)行函數(shù)前加個分號是什么意思寫法最前最后加括號推薦這種寫法外面加括號目前很多比較好的使用的都是第二種方式。 定義 立即執(zhí)行函數(shù)模式是一種語法,可以讓你的函數(shù)在定義后立即被執(zhí)行,這種模式本質(zhì)上就是函數(shù)表達式(命名的或者匿名的),在創(chuàng)建后立即執(zhí)行;立即執(zhí)行函數(shù)(imme...
摘要:打開源碼,首先你會看到這樣的代碼結(jié)構(gòu)這是一個自調(diào)用匿名函數(shù)。模式,是自執(zhí)行函數(shù)的高級模式,可以非常方便的在各個匿名閉包中以全局對象調(diào)用閉包函數(shù)。 打開jQuery源碼,首先你會看到這樣的代碼結(jié)構(gòu): (function(window,undefined ){ // })(); 這是一個自調(diào)用匿名函數(shù)。什么東東呢?在第一個括號內(nèi),創(chuàng)建一個匿名函數(shù);第二個括號,立即執(zhí)行 為什么要創(chuàng)建這樣一個...
閱讀 1199·2021-10-11 10:59
閱讀 1979·2021-09-29 09:44
閱讀 866·2021-09-01 10:32
閱讀 1441·2019-08-30 14:21
閱讀 1883·2019-08-29 15:39
閱讀 2990·2019-08-29 13:45
閱讀 3546·2019-08-29 13:27
閱讀 2017·2019-08-29 12:27