匿名函數(shù)丹喻,顧名思義是沒有函數(shù)名稱的函數(shù)。
我們先創(chuàng)建一個普通函數(shù):
//普通函數(shù)
function fn(){
alert("我是普通函數(shù)")
}
fn() //調(diào)用
我們接著來看匿名函數(shù):
//匿名函數(shù) 懈玻,單獨的匿名函數(shù)無法使用,因為函數(shù)調(diào)用必須要用到函數(shù)名稱
function (){
alert("我是匿名函數(shù)")
} //報錯
我們再來看看匿名函數(shù)的調(diào)用方法:
情況1.把匿名函數(shù)賦值給變量
var fn1 = function(){
alert("我是匿名函數(shù)被賦值給變量調(diào)用")
}
fn1();//我是匿名函數(shù)被賦值給變量調(diào)用
情況2.匿名函數(shù)自我調(diào)用,表達(dá)式的方式
(function(){
alert("我是匿名函數(shù)通過表達(dá)式自我執(zhí)行")
})();
//我是匿名函數(shù)通過表達(dá)式自我執(zhí)行
再來看看匿名函數(shù)是如何傳遞參數(shù)的:
匿名函數(shù)傳遞參數(shù),調(diào)用方法與上面相同
//1.賦值給變量
var fn2 = function (num1,num2){
alert(num1+num2)
};
fn2(1000,1000);
//2. 自我調(diào)用方法
(function(num1,num2){
alert(num1+num2)
})(100,100);
什么是閉包呢?
閉包的概念:
閉包就是有權(quán)(訪問)付鹿,(另一個函數(shù)作用域)中(變量的函數(shù));
閉包可以簡單理解成“定義在一個函數(shù)內(nèi)部的函數(shù)“蚜迅。所以舵匾,在本質(zhì)上,閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來的橋梁谁不。
閉包的作用:
一個是前面提到的可以讀取函數(shù)內(nèi)部的變量坐梯,
另一個就是讓這些變量的值始終保持在內(nèi)存中,不會在調(diào)用后被自動清除刹帕。
閉包的概念不太好理解吵血,但是通過一些例子還是很好理解的;
閉包的用途1偷溺,讀取函數(shù)內(nèi)部的變量
例子1:
function myfun(){
return function (){
return("你用閉包的方式訪問到我1")
}
}
alert(myfun); //輸出myfun整個函數(shù)表達(dá)式
alert(myfun()); //輸出匿名函數(shù)表達(dá)式
//閉包調(diào)用方式1
alert(myfun()());
//閉包調(diào)用方式2
var a = myfun(); //賦值給變量
alert(a())
例子2.通過閉包訪問局部變量
function myfun2(){
var a = "你用閉包的方式訪問到我2";
return function (){
return a;
}
}
//閉包調(diào)用方式1
alert(myfun2()())
//閉包調(diào)用方式2
var b = myfun2();
alert(b());
通過上面兩個例子相信就大家就能看出來閉包的作用和使用方法蹋辅。是不是很簡單。
閉包的作用2
可以讓局部變量始終保持在內(nèi)存中
例子1:
首先來看簡單的累加應(yīng)用:
var num = 1; //通過全部變量來實現(xiàn)
function add() {
alert(num++)
}
add();//1 每次調(diào)用的時候全局變量都會進(jìn)行++挫掏,這樣就實現(xiàn)了累加
add();//2
add();//3
我們在局部變量中看下:
function add2(){
var num2 = 1; //局部變量無法實現(xiàn)累加
alert(num2++)
}
add2();
//1由于在局部變量中每次調(diào)用都會初始化num2=1侦另,所以就無法實現(xiàn)累加,這種情況下尉共,我們就得使用閉包
add2();//1
add2();//1
通過閉包的方式:
function add3(){
var num3 = 1;
return function (){
num3++;
alert(num3)
}
}
//這種方式并不會實現(xiàn)累加褒傅,因為每次調(diào)用一次函數(shù),函數(shù)都會從上到下執(zhí)行一次袄友,num都會初始化一次
// add3();//1
// add3();//1
// add3();//1
來看看另一種閉包的調(diào)用方式
var fun =add3();
//函數(shù)只在賦值的時候初始化一次殿托,接著后面在調(diào)用的時候執(zhí)行的是里面的匿名函數(shù),所以這種方法是可行的杠河。
fun();//2
fun();//3
fun();//4
閉包的優(yōu)缺點:
優(yōu)點:可以將局部變量駐留在內(nèi)存中碌尔,可以避免全局變量浇辜。
全局變量會在復(fù)雜的程序中造成許多麻煩(命名沖突,垃圾回收)
缺點:由于閉包作用域返回的局部變量資源不會被立即銷毀回收唾戚,
可能會占用更多內(nèi)存柳洋,過度使用閉包會導(dǎo)致性能下降;
所以我們最好在使用完畢之后賦值null
fun=null;