前言
之前在网上看了很多关于JS的知识,再加上自己之前看的一些经典书(包括《javascrtipt高级程序设计》、《你不知道的JS》、《JavaScript语言精粹》等),所以回顾总结一下遇到的一些JS经典问题和重难点。
一、函数声明和函数表达式
在介绍什么的IIFE之前,先区分一下 函数声明 和 函数表达式。
定义函数的方式有两种:函数声明 和 函数表达式。
1 函数声明(function declaration),即形如:
function funcName(){
函数体......
}
函数声明的特点是:
- 必须要有函数名,它不能匿名;
- 函数声明提升
- 不能在函数声明后面加()直接调用它;
2 函数表达式,最常见的语法形式是:
var funcName = function(){
函数体......
}
函数表达式的特点是:
- 可以匿名;
- 没有声明提升,使用前必须先赋值
- 可以在 函数表达式后面加()来 运行/调用函数
二、什么是IIFE
IIFE(Immediately-Invoked Function Expression),即 立即调用的函数表达式。它的创建过程是:
1 声明一个匿名函数;
2 马上调用这个匿名函数
典型的例子是:(function funcName(){....})()
它还有一个变形写法,更有利于代码压缩,即
!function(){...} ()
“!”的存在让整句话可以当一元运算表达式来看,这样“function(){}”就被看成了一个函数表达式,执行结果再作为“!”的operand
三、IIFE的作用
1 隔离作用域
IIFE最主要的作用,就是用来隔离作用域。
在ES6之前,JS只有函数作用域,而没有块级作用域。那么为了能够隔离作用域,就只能把代码用一个函数框起来了,然后用所谓立即执行函数的方式,来模拟局部作用域。
具体的例子见:
例1
2 惰性载入
即
用IIFE写惰性载入,因为函数被执行引擎以同步的方式立即执行了,所以当在之后的代码访问这个变量时,可以直接返回计算后的筛选结果。
四 Reference
1 Javascript高级程序设计;
2 什么是立即执行函数?有什么作用?;
3 这段 JavaScript 代码是什么意思?;
4 为什么要有js立即执行函数,存在的意义是什么?;