什么是閉包
? ??閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。
? ??創(chuàng)建閉包最常見方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。

閉包的作用域鏈包含著它自己的作用域,以及包含它的函數(shù)的作用域和全局作用域。
閉包的注意事項
通常,函數(shù)的作用域及其所有變量都會在函數(shù)執(zhí)行結(jié)束后被銷毀。但是,在創(chuàng)建了一個閉包以后,這個函數(shù)的作用域就會一直保存到閉包不存在為止。

// 釋放對閉包的引用
add5 = null;
add10 = null;
add5 和 add10 都是閉包。它們共享相同的函數(shù)定義,但是保存了不同的環(huán)境。在 add5 的環(huán)境中,x 為 5。而在 add10 中,x 則為 10。最后通過 null 釋放了 add5 和 add10 對閉包的引用。
在javascript中,如果一個對象不再被引用,那么這個對象就會被垃圾回收機制回收;?
如果兩個對象互相引用,而不再被第3者所引用,那么這兩個互相引用的對象也會被回收。
閉包只能取得包含函數(shù)中任何變量的最后一個值,這是因為閉包所保存的是整個變量對象,而不是某個特殊的變量。

obj.getName()()實際上是在全局作用域中調(diào)用了匿名函數(shù),this指向了window。這里要理解函數(shù)名與函數(shù)功能(或者稱函數(shù)值)是分割開的,不要認(rèn)為函數(shù)在哪里,其內(nèi)部的this就指向哪里。匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其 this 對象通常指向 window。

閉包的應(yīng)用
任何在函數(shù)中定義的變量,都可以認(rèn)為是私有變量,因為不能在函數(shù)外部訪問這些變量。私有變量包括函數(shù)的參數(shù)、局部變量和函數(shù)內(nèi)定義的其他函數(shù)。
把有權(quán)訪問私有變量的公有方法稱為特權(quán)方法(privileged method)。

模塊模式(The Module Pattern):為單例創(chuàng)建私有變量和方法。
單例(singleton):指的是只有一個實例的對象。JavaScript 一般以對象字面量的方式來創(chuàng)建一個單例對象。

上面是普通模式創(chuàng)建的單例,下面使用模塊模式創(chuàng)建單例:

匿名函數(shù)最大的用途是創(chuàng)建閉包,并且還可以構(gòu)建命名空間,以減少全局變量的使用。從而使用閉包模塊化代碼,減少全局變量的污染。

在這段代碼中函數(shù) addEvent 和 removeEvent 都是局部變量,但我們可以通過全局變量 objEvent 使用它,這就大大減少了全局變量的使用,增強了網(wǎng)頁的安全性。
