iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
自我挑戰組

前端補給站,每天一個知識點系列 第 4

Day03【JS】立即呼叫函式 IIFE

  • 分享至 

  • xImage
  •  

IIFE 全稱為
Immediately Invoked Function Expression
中文翻譯成立即呼叫函式即刻調用函式運算式

立即執行函式的長相:
(function foo(){...})();

第一眼看到這段程式碼時,
或許會覺得難以理解,
但先看看一般函式調用方式:

// 定義函式
function sayHi(){
console.log('Hi')
}

// 呼叫函式
sayHi();

上面呼叫的部分,
用以下寫法其實是一樣的

(sayHi)()

這樣一來,以下的 function 就不難理解了

(function foo(){ 
	var a = 3;
	console.log( a ); // 3
})(); 

可以看到上面的架構和前面的 (sayHi)() 其實是一樣的,
只是它在被定義時同時就被執行,
這就是所謂的立即執行函式(Immediately Invoked Function Expression)。

要細分的話,
IIFE 另外又分成具名立即執行函式
匿名立即執行函式
差別僅是有沒有指定名稱:

// 具名
(function foo(){ 
	var a = 3;
	console.log( a ); // 3
})();

// 匿名
(function (){ 
	var a = 2;
	console.log( a ); // 2
})();

不論有沒有指定名稱,
IIFE 都會在當下立刻調用執行。

比較要注意的是,
如上的 foo 雖然有被宣告,
但包在被執行的 () 號中,
所以在執行完會馬上釋放掉記憶體,
之後要再呼叫 foo() 的話,
會報 foo is not defined 的錯誤。

以上總結出 IIFE 兩個特性:

  • 立刻執行
  • 無法在函式外被再次執行

因為 IIFE 會立即調用,
因此在賦值時,變數接收到的是執行完畢回傳的值。

var x = (function IIFE(){
	return 42;
})();

x;	// 42

IIFE 的其他功能

指定範疇:將傳入的參數當作作用域

var a = 2;

(function IIFE(global) {
  var a = 3;
  console.log(a); // 3
  console.log(global.a); // 2
})(window);

console.log(a); // 2

確保 undefined 的正確性

undefined = true;

(function IIFE(undefined) {
  var a;
  if (a === undefined) {
    console.log('Undefined 在這裡很安全!');
  }
})();

反轉順序 UMD(Universal Module Definition)

var a = 2;

(function IIFE(def) {
  def(window);
})(function def(global) {
  var a = 3;
  console.log(a); // 3
  console.log(global.a); // 2
});

參考資料


上一篇
Day02【JS】Event Delegation 事件委派
下一篇
Day04【JS】Promise、Async 和 Await
系列文
前端補給站,每天一個知識點30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言