自调用表达式
由函数表达式创建的函数可以自调用,称之为自调用表达式。
语法
由函数表达式创建函数:
const myFn = function () {
let a = 100
console.log(a);
return a
}
myFn() //调用后执行,输出100
表达式后面紧跟 ( ) 则会自动调用:
const myFn = function () {
let a = 100
console.log(a);
return a
}() //输出100
( )中可以传入参数
const myFn = function (param) {
console.log(param);
}(2333) //输出2333
更简洁的写法:将函数体部分用 ( ) 包裹起来,解析器将会以函数表达式的方式去调用定义函数。
(function () {
let a = 100
console.log(a);
return a
})() //输出100
或将函数体部分和紧跟的括号 ( ) 一起用 ( ) 包裹起来
(function () {
let a = 100
console.log(a);
return a
}()) //输出100
也就是说,任何能将函数变成一个函数表达式的做法,都可以使解析器正确调用定义函数。 ! + - ~
都有这样的功能。
!function () {
let a = 100
console.log(a);
return a
}() //输出100
关键字 void、new、delete也能达到同样效果
void function () {
let a = 100
console.log(a);
return a
}() //输出100
总结:
-
格式1
( function (paramAXXX) { //TODO } ) ( AXXX )
-
格式2
( function (paramAXXX) { //TODO } ( AXXX ) )
-
格式3
! function (paramAXXX) { //TODO } ( AXXX )
特点
自调用函数也可称之为”立即执行函数“,函数执行完函数空间就被释放,不能再被访问,但函数返回值可以被保存。故这种调用方法多是针对初始化功能的函数,即函数只执行一次的情况。
const myFn = function () {
let a = 100
console.log(a);
return a
}() //输出100
myFn() //报错:myFn is not a function,此时myFn保存的是上面函数中变量a的值100,而不是一个函数。
因为不能再通过函数名再次被调用。所以,在写立即执行函数时就没有必要写函数名称。函数自调用完成,函数自动被销毁。