什么是立即执行函数?
比如说我现在在全局 function a(){},function b(){},这两个函数假如说写在全局,如果 JavaScript 不执行完,这两个函数永远都是等待被执行,永远释放不了,假如定义一个函数你只想用一次,后边就不用他了,他还一直写在全局不释放,这样的话就很占空间了,鉴于此,JS 给我们提供了一类函数,叫立即执行函数,这种函数执行完马上就释放了,是针对初始化功能的函数,不占用内存空间。
(1) 它的形式:
(function (){
}())
先写一对小括号,然后里边写上 function,都不用起名,然后小括号大括号,最后来个小括号,他也是 js 里唯一一个执行完立即销毁的函数。他和普通函数除了执行完就被销毁之外没有任何区别。他也可以有参数,比如说:
(function (a,b){
console.log(a + b);
}(1,2)) //输出就得 3
也可以
var num = (function (a,b){
console.log(a + b);
}(1,2))
我们在外边 var 一个 num 接收返回值,那么,num 就是 3.
(2) 它的写法:
第一种:(function (){}()) W3C 组织建议这一种写法
第二种:(function (){})()
(3) 拓展:
只有表达式才能被执行符号执行。
比如说:
function test(){
console.log(1);
}()
这么写系统会报错,因为这个是函数声明不是表达式,你必须在底下单独写 test(); 下边写的 test 才叫做表达式,像 123、234、1 + 2 这都叫表达式,再比如:
var test = function (){
console.log(1);
}()
这么写就可以执行,因为它本身就是函数表达式。能被执行符号执行的表达式他的函数名就会被自动放弃,也就是说能被执行符号执行的表达式他就成了立即执行函数,就像上边的,你在后边加了括号就是立即执行,他就成了立即执行函数。再比如:
+ function (){
console.log(1);
}()
本来他是函数声明,但是你在前边加上正号他就理论上转换为数字了,那他就是一个表达式,你再后边直接加()就会执行,变成立即执行函数,然后忽略函数名,你执行完后输出 test 就会报错,当然前边加上-或者!都可以,&&和||也可以,不过两边都要有东西,但是*和/不行,这里的±代表正负号。再比如:
(function (){
console.log(1);
}())
我们如果在外边加一个小括号,他也就成了一种表达式,因为我们计算的时候,有时候有小括号,那么,他就会自动放弃函数名,后来人们一看,有没有函数名都无所谓, 所以后来就去掉了,成了现在的立即执行函数(执行符号()放在括号里边或者外边都可以,W3C 组织建议放在里边)