轉載:http://blog.sina.com.cn/s/blog_50197c290101f870.html
先上段代碼:
//函數a
{
var i=0;
//函數b
function b()
{
alert(++i);
}
return b;
}
//函數c
var c = a();
c();
代碼特點:
1、函數b嵌套在函數a內部;
2、函數a返回函數b。
代碼中函數a的內部函數b,被函數a外面的一個變量c引用的時候,這就叫創建了一個閉包。有時候函數b也可以用一個匿名函數代替來返回,即return function(){};
優點:1.保護函數內的變量安全,加強了封裝性 2.在內存中維持一個變量(用的太多就變成了缺點,佔內存)
閉包之所以會佔用資源是當函數a執行結束後, 變量i不會因爲函數a的結束而銷燬, 因爲b的執行需要依賴a中的變量。
不適合場景:返回閉包的函數是個非常大的函數
閉包的典型框架應該就是jquery了。
閉包是javascript語言的一大特點,主要應用閉包場合主要是爲了:設計私有的方法和變量。
這在做框架的時候體現更明顯,有些方法和屬性只是運算邏輯過程中的使用的,不想讓外部修改這些屬性,因此就可以設計一個閉包來只提供方法獲取。
閉包的缺點就是常駐內存,會增大內存使用量,使用不當很容易造成內存泄露。
1. 邏輯連續,當閉包作爲另一個函數調用的參數時,避免你脫離當前邏輯而單獨編寫額外邏輯。
2. 方便調用上下文的局部變量。
3. 加強封裝性,第2點的延伸,可以達到對變量的保護作用。
缺點:
閉包有一個非常嚴重的問題,那就是內存浪費問題,這個內存浪費不僅僅因爲它常駐內存,更重要的是,對閉包的使用不當會造成無效內存的產生