匿名函数又叫立即执行函数。
因为是匿名的,所以不能被调用。
因为不能被调用,所以不立即执行的话就没意义了。
因为立即执行,所以在执行完之后就会被销毁。
第一种(常用)
( function(){…} )()
第二种(常用)
( function(){…}() )
第三种(不常用)
~function(){…}()
前两种写法,返回值都是正常的。
第三种写法的返回值会比较奇怪,所以很少用。
第一种写法
在控制台输出 1
第二种写法
在控制台输出 2
第三种写法
在控制台输出 -4
在控制台输出2
假设第三种写法的返回值是未知数 x。
则得到的返回值是:-(x + 1)
对于一个js匿名函数
自调用这个匿名函数
这样解释器会报错
为什么呢? 原因可以看一个普通js函数的调用
这是一个函数声明,如果在这么一个声明后直接加上括号调用,解析器不能理解而会报错:
而a函数申明时候,调用就可以直接加 ()
这里可以看出无论是命名函数还是匿名函数,都是函数申明,而直接对匿名函数加 () 之后,解释器就不能理解而报错了
要自调用匿名函数,就需要把匿名函数声明语句变成一个表达式
期望是立即调用一个具名函数表达式,结果是声明了函数 g。末尾的括号作为分组运算符,必须要提供表达式做为参数。所以那些匿名函数附近使用括号或一些一元运算符的惯用法,就是来引导解析器,指明运算符附近是一个表达式。
按照这个理解,可以举出五类,超过十几种的让匿名函数表达式立即调用的写法:( function() {}() )
( function() {} )()
[ function() {}() ]
~ function() {}()
! function() {}()
+ function() {}()
- function() {}()
delete function() {}()
typeof function() {}()
void function() {}()
new function() {}()
new function() {}
var f = function() {}()
1, function() {}()
1 ^ function() {}()
1 >function() {}()