學了,也看了一些關於閉包的東西,做個總結,以備不時之需,可能有不足的地方,我對閉包也不是很瞭解。
一、什麼是閉包?
閉包百度一搜,會有太多的解釋。
閉包就是嵌套在函數裏面的內部函數,並且該內部函數可以訪問外部函數聲明的所有局部變量、參數、和其它內部函數。當該內部函數在外部函數被調用時就生成了閉包。
說了一堆,舉例說明:
function wai(){
var num=1;
function nei(){
alert(num);
}
return nei;
}
nei()函數就是一個閉包。
var fn=wai();
fn(); //1, 相當於wai()()
二、好處
1、可以讀取函數內部的變量,
2、可以讓這些局部變量保存在內存中,實現變量數據共享。
還是以上面的代碼分析,第一個好處,nei()函數可以訪問外部函數的變量num
第二個好處:
function wai(){
var num=1;
function nei(){
alert(num);
num++;
}
return nei;
}
var fn=wai();
fn(); //1
fn(); //2
fn(); //3
fn(); //4
不斷遞增,這就實現了變量數據共享。
三、缺點
1、由於閉包會使得函數中的變量都保存在內存中,一方面會使內存消耗大,另一方面在ie下導致內存泄露(不太懂,但是聽上去感覺很嚴重的樣子),結局辦法,在退出函數時,將不使用的局部變量全部刪除(null掉吧)
2、閉包會在父級外部,改變父函數內部內部變量的值(例子中的num);所以,如果你把父函數當作對象(object)使用,把閉包當做它的公用方法,把內部變量當做它的私有屬性,這時你需要做的是,加倍小心,不要隨便改變函數的值,否則你會後悔的。
四、總結
現在可能是學的也不深,對閉包真的感覺沒有用到,所以也沒有切身的體會,一直被聽說,不明覺厲