前言
如果我在全局的范围内定义了一个函数
<script>
function a(){
}
function b(){
}
</script>
这两个函数除非等到执行之前,是不是一直处于等待被执行的情况,而一直等待被执行 是不是占用空间,除非等到JavaScript被执行完,才能把空间给释放掉
更特殊的时候,有的函数(例如针对初始化功能的函数)从出生到它执行完,他就被执行了一次,这种函数我们一般不想像上述那种定义方式来实现,我们给出了一种叫做 立即执行函数
立即执行函数(Imdiately Invoked Function Expression IIFE)
一个在定义的时候就立即执行的JavaScript函数
如下就是立即执行函数两种写法
(function (){
}())//W3C 推荐这种写法
(function (){
})();
我们用第一种写法进行解释
函数执行完就被销毁
为什么立即执行函数不用函数名
首先来看下下面这一段代码
(function abc() {
var a = 123;
var b = 234;
console.log(a + b);
}())
因为立即执行函数执行完就被销毁,所以,根本不需要添加函数名
立即执行函数除了执行完就被释放,除此之外,函数该有的东西,立即执行函数都有
立即执行函数的形参、实参以及返回值
(function (a,b,c) {
//第一个括号可以写形参
}(1,2,3))
//第二个括号里面可以传递实参
var num = (function () {
return 4;
}())
//通过外界变量传递返回值
深入浅出
如下函数申明
function test(){
console.log('a');
}
然后大家来看啊,你看,我们这个函数申明和函数执行是不是一模一样,那如果在函数申明后面加一对括号,是不是也能执行呢?
function test(){
console.log('a');
}() //结果是报错的,语法解析错误
function test(){
console.log('a');
}
test(); //这样才可以
为什么?别急,先记住一句话
只有表达式才能被执行符号执行
因为上述的第一种情况,在function后面加括号,那个不叫函数表达式,那个叫做函数申明
欸,那我们也知道有一种叫做函数表达式,那么可以被括号执行吗?
var test = function () {
console.log('a');
}();//控制台上输出了 a
+ function test(){
console.log('a');
}();//这样也是可以的 因为它是一个表达式了
(function test() {
console.log('a');
})();//这样也是可以的,因为加了括号也就变成了表达式了
结果告诉我们是可以的
再来一个知识点
能被执行符号执行的函数表达式,这个函数名字就会被自动忽略
上述同样的代码运行之后,在控制台上输入test
得到的结果如下
所以是不是,这个表达式定义出来之后,马上被执行,并且被释放了,所以可以说,能被执行符号执行的表达式,基本上就成了立即执行函数
(function (){}())
我们上面讲了,只有表达式才能被执行符号执行,那么我们这一条代码怎么理解呢?
其实是因为,最外层的括号先执行,所以内部的就是表达式了
所以最后的执行符号()就可执行了
Ps:若有错误,欢迎指出