1. 程式人生 > >關於javascript 立即呼叫的函式 IIFE ( Immediately Invoked Function Expression)

關於javascript 立即呼叫的函式 IIFE ( Immediately Invoked Function Expression)

4.1 正常寫法

const pkgConf = require('pkg-conf');

async function main(){
	const config = await pkgConf('unicorn');

	console.log(config.rainbow);
	//=> true
}

main();

變態寫法

const pkgConf = require('pkg-conf');

(async () => {
	const config = await pkgConf('unicorn');

	console.log(config.rainbow);
	//=> true
})();

以上這段程式碼 實在 github上看 i5ting 大神的如何正確學習nodejs中的一段程式碼  
關於變態寫法 這個就是 js的  Immediately Invoked Function Expression即立即執行表示式,

網上有關這立即執行表示式的 精彩的回答很多,這篇我選了一位大神的精彩回答列在此處:

你需要明白 IIFE 的原理,我簡單說一下:

function foo() {...}     // 這是定義,Declaration;定義只是讓直譯器知道其存在,但是不會執行。

foo();                   // 這是語句,Statement;直譯器遇到語句是會執行它的。

IIFE 並非必須,傳統一點可以這麼寫:

function foo() {...}
foo();

那麼為什麼要 IIFE?

  1. 傳統的方法囉嗦,定義和執行分開寫;

  2. 傳統的方法直接汙染全域性名稱空間(瀏覽器裡的 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 物件
回答出處(https://segmentfault.com/q/1010000000442042)

cnode中文社群有很多精彩的討論 與回答,大神雲集,我要爭取每天抽時間 在cnode社群看看大神的文章