JS匿名函数与自执行

概念

匿名函数:就是没有函数名的函数。

声明一个匿名函数,并马上调用这个匿名函数就叫做匿名立即执行函数。

写法

首先, 要清楚函数语句和表达式的区别。
function这个关键字,既可以当做语句,也可以当做表达式。

1
2
3
4
//语句
function fn() {};
//表达式
var fn = function (){};

为了避免解析上的歧义,JS引擎规定,如果function出现在行首,一律解析成语句。因此JS引擎看到行首是function关键字以后,认为这一段都是函数定义。让JS引擎将其理解为一个表达式,最简单的处理就是将其放在一个圆括号里。

像如下的代码所示,就是一个匿名立即执行函数:

1
2
3
(function() {
//code
})()

立即执行函数,还有一些其他的写法:

1
2
3
4
5
6
7
8
(function () {alert("我是匿名函数")}())
(function () {alert("我是匿名函数")})()
!function () {alert("我是匿名函数")}()
+function () {alert("我是匿名函数")}()
-function () {alert("我是匿名函数")}()
~function () {alert("我是匿名函数")}()
void function () {alert("我是匿名函数")}()
new function () {alert("我是匿名函数")}()

+ ! - ~ void等操作符的作用是将函数转换为表达式。

括号的意义

包住function(){}的括号是把function(){}转化成一个可执行的表达式,方便执行。
第二个括号的作用就是执行表达式。

当js执行function() {}()时, 由于function() {}在”预编译”阶段已经被解释过, js会跳过function(){}, 试图去执行(), 故会报错。

当js执行(function {})()时, 由于(function {})是表达式, js会去对它求解得到返回值, 由于返回值是一个函数, 故而遇到()时, 便会被执行。

立即执行函数的参数

1
2
3
(function(j) {
//代码中可以使用j
})(i)

如果立即执行函数中需要全局变量,全局变量会被作为一个参数传递给立即执行函数。
上例中的i就是一个全局变量,i代表的是实参,j是i在立即执行函数中的形参。

立即执行函数的作用

立即执行函数会形成一个单独的作用域,我们可以封装一些临时变量或者局部变量,避免污染全局变量。

打赏
  • Copyrights © 2017-2023 WSQ
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信