Day03【JS】立即呼叫函式 IIFE

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
});

参考资料


<<:  Day 7 到底有没有被激励到?

>>:  抽象类别与介面 (1)

[D03] 取样与量化(1)

我们在用电脑处理影像时,由於电脑只看得懂数字,所以影像必须要以离散(discrete)的形式处理,也...

[CSS] Flex/Grid Layout Modules, part 6

你如果会用 Excel,那 Grid 就应该不陌生。 不过老实讲,我也不太会用 Excel。 Gr...

D3JsDay07不懂资料格式,那就会我们曾相识,只是不合适—档案格式介绍

格式介绍 通常你的资料会是档案、API接口或是一个连结作为D3输入的资料,这边就以下常见的资料格式简...

Day 7:AWS是什麽?30天从动漫/影视作品看AWS服务应用 -《PSYCHO-PASS心灵判官》part1

提到健康监控系统,就不可不提鼎鼎大名的《PSYCHO-PASS心灵判官》中的希必拉系统Sibyl S...

[Day - 30] 不完美的结束

最後,还是到了这最後一天,这第 30 天不完美的完赛,有时候时常都会想,上班就很忙了,开的 Tick...