1. 程式人生 > >閉包的概念以及用法

閉包的概念以及用法

自己看視訊看文章總結出來的,

概念:

 閉包就是能夠讀取其他函式內部變數的函式。

由於在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中可能導致記憶體洩露。解決方法是,在退出函式之前,將不使用的區域性變數全部刪除。

大傢伙看懂的就給我點個贊吧,文章右上角。