IIFE的叫法最先見於Ben Alman的文章。文章中Ben Alman 已經解釋得很清楚了,但願定義自執行函數式常見的語法錯誤有兩種:javascript
1) function (){ }()
html
指望是當即調用一個匿名函數表達式,結果是進行了函數聲明,函數聲明必需要有標識符作爲函數名稱。java
2) function g(){ }()
express
指望是當即調用一個具名函數表達式,結果是聲明瞭函數 g。末尾的括號做爲分組運算符,必需要提供表達式作爲參數。
因此那些匿名函數附近使用括號或一些一元運算符的慣用法,就是來引導解析器,指明運算符附近是一個表達式。ide
按照這個理解,能夠舉出五類,超過十幾種的讓匿名函數表達式當即調用的寫法:函數
1)使用括號post
( function() {}() ); ( function() {} )(); [ function() {}() ];
2)使用一元操做符ui
~ function() {}(); ! function() {}(); + function() {}(); - function() {}();
3)使用void等操做符spa
delete function() {}(); typeof function() {}(); void function() {}();
4)使用表達式code
var i = function(){ return 10; }(); 14.true && function(){ /* code */ }(); 15.0, function(){ /* code */ }(); 1 ^ function() {}(); 1 > function() {}();
5)使用new關鍵字
new function(){ /* code */ } 31.new function(){ /* code */ }() //若是沒有參數,最後的()就不須要了
可是整體來講,比較常見的是以下三種寫法:
// Crockford's preference - parens on the inside (function() { console.log('Welcome to the Internet. Please follow me.'); }()); (function() { console.log('Welcome to the Internet. Please follow me.'); })(); !function() { console.log('Welcome to the Internet. Please follow me.'); }();
其實討論IIFE的多少種寫法多少和研究茴香豆的「茴」字有幾種寫法同樣無聊,但其實不無用處,至少在閱讀別人的代碼時見到這樣的寫法不至於不知所云,抑或能夠拿出去和小夥伴們裝裝,頓時以爲逼格提高很多。
參考資料:
http://benalman.com/news/2010/11/immediately-invoked-function-expression/(中文譯文:http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html)
http://www.elijahmanor.com/angry-birds-of-javascript-red-bird-iife/(中文譯文:http://nuysoft.com/2013/04/15/angry-birds-of-javascript-red-bird-iife/Immediately-invoked%20Function%20Expression)