閉包的概念以及用法
阿新 • • 發佈:2018-12-11
自己看視訊看文章總結出來的,
概念:
閉包就是能夠讀取其他函式內部變數的函式。
由於在javascript中,只有函式內部的子函式才能讀取區域性變數,所以說,閉包可以簡單理解成“定義在一個函式內部的函式“。
所以,在本質上,閉包是將函式內部和函式外部連線起來的橋樑。
常見的閉包迴圈錯誤:
var call=[] for(var i=0;i<=2;i++){ call[i]=function(){ return i*2 } } console.log(call[0]()); //打印出來是6 console.log(call[1]()); //打印出來是6 console.log(call[2]()); //打印出來是6
what???為什麼打印出來的是6 6 6?不應該是0 2 4嗎,如果對閉包不理解的同學肯定會這樣想。
其實當我們執行 return i*2 的時候,此時的 i 並不是for迴圈中遍歷出來的0,1,2。而是for迴圈全部迴圈後,直到i<=2,i++的結果,此時 i =3。(閉包會等for迴圈都執行完了,再取最終的 i )
如何解決這個問題:用匿名函式把閉包 包起來,並且告訴這個函式,我要 i 每次迴圈的時候都馬上執行一次我的閉包。
var call=[]
for(var i=0;i<=2;i++){
!function(i){
call[i]=function(){
return i*2
}
}(i)
}
console.log(call[0]()); //打印出來是0
console.log(call[1]()); //打印出來是2
console.log(call[2]()); //打印出來是4
閉包用法之封裝
我們定義了一個匿名函式,裡面有變數,並且不想讓外面隨隨便便就訪問到,這樣就可以閉包。
(function(){ var _userId=110; var _typeId='item'; var lalala={}; function converter(userId){ return userId } lalala.getUserId=function(){ return converter(_userId) } lalala.getTypeId=function(){ return _typeId } window.lalala= lalala }()) console.table([ lalala.getUserId(), //110 lalala.getTypeId(), //item lalala._userId, //undefined lalala._typeId, //undefined lalala.converter, //undefined ])
這樣只有通過lalala才能訪問我們匿名函式中定義的變數
使用閉包的注意點
由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在IE中可能導致記憶體洩露。解決方法是,在退出函式之前,將不使用的區域性變數全部刪除。
大傢伙看懂的就給我點個贊吧,文章右上角。