IIFE立即执行函式

IIFE(Immediately Invoked Function Expression),是一种「可以立即执行的函式」。

一般的函式长这样:

function doSomething (x){
	//do something
};

doSomething(参数);  //呼叫doSomething,执行程序区块

而立即执行函式长成这个样子:

(function doSomething (x) {
	//do something
})(参数);  //不用呼叫doSomething函式,X带入参数,立即在程序区块中执行

立即执行函式,不透过呼叫函式的方式,浏览器读到函式後面附加的小括号( ),就知道要在函式宣告的当下立即执行。

假设洪七公嘴馋想吃叫化鸡,叫黄蓉马上烤一只叫化鸡来吃:

(function cooking(food){
	console.log(`丫头去弄个${food}来吃吃!!!`);
})('叫化鸡')  //丫头去弄个叫化鸡来吃吃!!!

cooking('东坡肉');  //Uncaught ReferenceError: cooking is not defined

如果在立即执行函式的外面再呼叫一次cooking函式,就会出现「Uncaught ReferenceError: cooking is not defined」。

既然提到了立即执行函式,让我们利用它来解一下面试中常常会出现的考题:

「每次间隔一秒,依次印出0、1、2、3、4」

你会怎麽解呢?直觉应该利用for回圈 + window.setTimeout()来解题:

for(var i = 0; i < 5; i++){
	window.setTimeout(function(){
		console.log(i);
	},1000)
}

结果是直接印出五个5,说好的0、1、2、3、4呢?

还记得前面提过「切分辨数最小范围是function」,所以for回圈和window.setTimeout()是个跑各的。

for回圈是急惊风,而window.setTimeout()是慢郎中,window.setTimeout()刚刚过了一秒去捉外面的i来console.log()的时候,for回圈已经跑完五次,i++变成5,不符合i<5的条件跳出回圈了,所以window.setTimeout()捉回圈的i,每次都捉到5。

那要怎麽解决这个问题呢? 我们可以把window.setTimeout()封装在一个立即执行函式里面,後面的小括号则带入回圈每次跑出来的 i,让 i 把值带入 x 里面丢到 window.setTimeout() 去执行。

for(var i = 0; i < 5; i++){

	(function(x){
		window.setTimeout(function(){
			console.log(x);
		},x*1000);
	})(i);
}

这样就会每隔1秒依序印出0、1、2、3、4了。

当然另外一个更简单的解法则是把for回圈的变数宣告「var i = 0」直接改成「let i = 0」,利用let是以大括号区块为作用域的概念,让for回圈必须与window.setTimeout()一起跑。

for(let i = 0; i < 5; i++){
	window.setTimeout(function(){
		console.log(i);
	},1000)
}

这样就会间格1秒,依序印出0、1、2、3、4了。


<<:  回头呼喊你的爱情:Callback回呼函式

>>:  Day13: 【TypeScript 学起来】只有 TS 才有的型别: Enum (列举)

Day9 javascript 条件语句

JavaScript 条件语句基於不同的条件来执行不同的动作,通常在写代码时,总是需要为不同的决定来...

C# Linq

今天 来讲讲Linq这个好用的东西吧 不过我不会着墨在他哪些方法怎麽用(这个自己Google应该就可...

Day 3 python条件语法

今天我们要介绍的是python当中简易的条件判断式,所谓的条件判断式就是只我们要去判断一个东西的是否...

第 5 天 还我漂漂拳| property binding、interface

前情提要 将英雄们显示在 Mat-Card 上後,我们进一步地要对英雄资料做点加工,并且制作英雄详细...

D7 - 彭彭的课程#Python 有序列表的基本运算 - List、Tuple

收假症候群大发作XDD 但今天还是有振奋人心的事情可以做啊 你各位有没有去绑定五倍卷了 希望这个艰辛...