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