立即执行函数

172 阅读2分钟

什么是立即执行函数

声明一个函数,并马上调用这个匿名函数就叫做立即执行函数。立即执行函数的创建步骤,看下图:

image.png

立即函数的写法

定义函数之后,立即调用该函数,这时不能在函数的定义后面直接加圆括号,这会产生语法错误。

function fn(){
  //code
}()
//Uncaught SyntaxError: Unexpected token ')'

这是因为,function 这个关键字,既可以当做语句,也可以当做表达式:

//语句
function fn() {};
//表达式
var fn = function (){};

为了避免解析上的歧义,JS引擎规定,如果function出现在行首,一律解析成语句。JS引擎看到行首是function关键字以后,认为这一段都是函数定义,不应该以原括号结尾,所以就报错了。

解决方法就是不要让function出现在行首,让JS引擎将其理解为一个表达式,最简单的处理就是将其放在一个圆括号里,比如下边:

(function(){
//code
}())

(function (){
//code
})()

上边的两种写法,都是以圆括号开头,引擎会意味后面跟的是表达式,而不是一个函数定义语句,所以就避免了错误,这就叫做"立即调用的函数表达式"。

立即执行函数,还有一些其他的写法(加一些小东西,不让解析成语句就可以),比如下边:

(function () {alert("我是匿名函数")}())   //用括号把整个表达式包起来
(function () {alert("我是匿名函数")})()  //用括号把函数包起来
!function () {alert("我是匿名函数")}()  //求反,我们不在意值是多少,只想通过语法检查
+function () {alert("我是匿名函数")}() 
-function () {alert("我是匿名函数")}() 
~function () {alert("我是匿名函数")}() 
void function () {alert("我是匿名函数")}() 
new function () {alert("我是匿名函数")}() 

立即执行函数的作用:

  • 不必为函数命名,避免了污染全局变量
  • 立即执行函数内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量
  • 封装变量