匿名函數就是沒有名字的函數,閉包是可訪問一個函數作用域里變量的函數。
一.匿名函數
//普通函數
function box() { //函數名是 box
return'Lee';
}
//匿名函數
function(){ //匿名函數,會報錯
return'Lee';
}
//通過表達式自我執行
(functionbox() { //封裝成表達式
alert('Lee');
})(); //()表示執行函數,并且傳參
//把匿名函數賦值給變量
var box=function(){ //將匿名函數賦給變量
return'Lee';
};
alert(box()); //調用方式和函數調用相似
//函數里的匿名函數
function box() {
return function(){ //函數里的匿名函數,產生閉包
return'Lee';
}
}
alert(box()()); //調用匿名函數
二:閉包
閉包的概念:閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的常見的方式,就是在 一個函數內部創建另一個函數,通過另一個函數訪問這個函數的局部變量。
//通過閉包可以返回局部變量
function a(){
var name='sun';
return function (){ //通過匿名函數返回 a()局部變量
return name;
}
}
alert(a()()); //通過a()()來直接調用匿名函數返回值
var b=a();
alert(b()); //另一種調用匿名函數返回值
使用閉包有一個優點,也是它的缺點:就是可以把局部變量駐留在內存中,可以避免使 用全局變量。
(全局變量污染導致應用程序不可預測性,每個模塊都可調用必將引來災難, 所以推薦使用私有的,封裝的局部變量)。
閉包的經典案例
通過全局變量來累加
var num=0; //全局變量
function a(){
num++; //模塊級可以調用全局變量,進行累加
}
a(); //1
a(); //2 //執行函數,累加了
alert(num); //輸出全局變量
<--------------------------------------------------------------->
function a(){
var num=0;
num++;
return num;
}
alert(a()); //1
alert(a()); //1 //無法實現累加,因為局部變量又被初始化了
使用閉包進行累加
function a(){
var num=0;
return function(){
num++;
return num;
}
}
var b=a(); //獲得函數
alert(b()); //1 //調用匿名函數
alert(b()); //2 //第二次調用匿名函數,實現累加
PS:由于閉包里作用域返回的局部變量資源不會被立刻銷毀回收,所以可能會占用更 多的內存。過度使用閉包會導致性能下降,建議在非常有必要的時候才使用閉包。