在JavaScript中,通常状况下定义一个函数须要给这个函数命名,或者建立一个变量接受一个函数,以方便以后调用。若是咱们不须要一个命名的函数,那么一般会使用当即执行函数(IIFE)来解决咱们的问题,同时,当即执行函数有时候能够帮咱们解决某些闭包问题。数组
function test(){
var arr = [];
for(var i=0;i<5;i++){
arr[i] = function(){
console.log(i);
}
}
return arr;
} //test()执行后返回一个数组,每一项为一个函数
复制代码
test().forEach((item)=>{
item()
}) // 输出 5 5 5 5 5
复制代码
若是咱们想要让test执行后的数组每一项返回对应的i值,能够经过当即执行函数解决bash
function test(){
var arr = [];
for(var i=0;i<5;i++){
(function(i){
arr[i] = function(){
console.log(i)
}
})(i)
}
return arr;
}
复制代码
test().forEach((item)=>{
item()
}) //输出0 1 2 3 4
复制代码
这是当即执行函数的一个应用,能够帮助咱们解决部分闭包问题,还有不少用途,好比避免变量污染,隔离做用域。最著名的仍是jQuery的应用了。那么当即执行函数有多少种写法呢?闭包
经过( )包裹函数体在经过( )执行函数函数
(function(){console.log(1)}())
(function(){console.log(2)})()
这两种方式等价,经过把匿名函数体变成表达式后自执行。ui
~function(){console.log(3)}()
-function(){console.log(4)}()
+function(){console.log(5)}()
!function(){console.log(6)}()
这四种方式经过位运算符把函数体变成表达式以后执行会致使返回的结果发生不一样。而且压缩代码后产生恐怖效应因此基本不推荐使用,还有一些赋值运算spa
var a = function(){console.log(7)}()
会致使函数自执行,包括一些逻辑运算符code
1 && function(){console.log(8)}()
ip
0 || function(){console.log(9)}()
甚至包括 new (毕竟ta也是一个运算符)也会致使函数的自执行!作用域
在实际开发中,为了防止代码压缩致使1,2方式与值钱的代码发生不清不楚的关系,通常会选择在当即执行函数以前添上 ';'。不过通常在使用时不多会接收返回值,还有一个更好的推荐--void运算符。开发
void function(){console.log(10)}()
经过void 知足咱们不用始终记得添加 ; 的痛苦~~。
OK 除了两种常见的运用方式,有没有以为知道的更多了点呢。