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

http://www.zhihu.com/question/20249179