本文對(duì)應(yīng)《JavaScript忍者秘籍》第5章內(nèi)容。
1.理解閉包
閉包允許函數(shù)訪問(wèn)并操作函數(shù)外部的變量,只要變量或函數(shù)存在于聲明函數(shù)是的作用域內(nèi)豁鲤。
來(lái)看一個(gè)簡(jiǎn)單的閉包:
var air='air';
var inTheHouse=()=>console.log('breathe '+air);
inTheHouse();//breathe air
現(xiàn)在我們?nèi)ッ绹?guó)呼吸香甜的空氣:
var breathe;
var sweetAir=()=>{
var air='American air';
breathe=()=>console.log('breathe '+air);
};
sweetAir();
breathe();//breathe American air
乍一看剂公,當(dāng)breathe()
執(zhí)行時(shí),air
所在的作用域已經(jīng)消失棚贾,為什么還能訪問(wèn)到內(nèi)部變量呢?
當(dāng)在外部函數(shù)中聲明內(nèi)部函數(shù)時(shí)榆综,不僅定義了函數(shù)的聲明妙痹,還創(chuàng)建了一個(gè)閉包。閉包包括函數(shù)的聲明鼻疮,和函數(shù)聲明時(shí)該作用域中的所有變量怯伊。當(dāng)內(nèi)部函數(shù)執(zhí)行時(shí),聲明時(shí)的作用域消失判沟,但通過(guò)閉包仍可訪問(wèn)原始的作用域耿芹。這樣我們就呼吸到了香甜空氣了。
存儲(chǔ)閉包將影響性能挪哄,勿濫用閉包吧秕。
2.應(yīng)用閉包
封裝私有變量
原生JavaScript
不支持私有變量。我們可以創(chuàng)建類似其他語(yǔ)言內(nèi)的私有變量迹炼,使他們對(duì)外部隱藏砸彬。
function Guess(){
var ans=Math.floor(Math.random()*100);
this.ask=(x)=>{
if(x<ans){
return "too small";
}
else if(x>ans){
return "too large";
}
else if(x===ans){
return "right!";
}
else{
return "無(wú)可奉告";
}
};
};
ans
在閉包內(nèi)部可以被ask
訪問(wèn)颠毙,在閉包外部不可訪問(wèn)。
回調(diào)函數(shù)
回調(diào)函數(shù)指需要在將來(lái)不確定的某一時(shí)刻異步調(diào)用的函數(shù)砂碉。
通常在回調(diào)函數(shù)中需要頻繁訪問(wèn)外部數(shù)據(jù)蛀蜜。