## 變量專題
> * 全局變量
> * 當一個變量被定義在全局作用域中,默認情況下`JAVASCRIPT`引擎就不會將其回收銷毀。如此該變量就會一直存在于老生代堆內存中,直到頁面被關閉。
> * `全局變量`缺點。
> * 使變量不易被回收。
> * 多人協作時容易產生混淆。
> * 在作用域鏈中容易被干擾。
> * 可以通過包裝函數來處理`全局變量`。
> * 局部變量。
> * 盡量選用局部變量而不是全局變量。
> * 局部變量的訪問速度要比全局變量的訪問速度更快,因為全局變量其實是`window`對象的成員,而局部變量是放在函數的棧里的。
> * 手工解除變量引用
>
>
> * 在業務代碼中,一個變量已經確定不再需要了,那么就可以手工解除變量引用,以使其被回收。
>
>
>
> ~~~
> var data = { /* some big data */ };
> // ...
> data = null;
> ~~~
>
>
> * 變量查找優化。
>
>
> * 變量聲明帶上`var`,如果聲明變量忘記了`var`,那么`JAVASCRIPT`引擎將會遍歷整個作用域查找這個變量,結果不管找到與否,都會造成性能損耗。
> * 如果在上級作用域找到了這個變量,上級作用域變量的內容將被無聲的改寫,導致莫名奇妙的錯誤發生。
> * 如果在上級作用域沒有找到該變量,這個變量將自動被聲明為全局變量,然而卻都找不到這個全局變量的定義。
> * 慎用全局變量。
> * 全局變量需要搜索更長的作用域鏈。
>
> * 全局變量的生命周期比局部變量長,不利于內存釋放。
>
> * 過多的全局變量容易造成混淆,增大產生bug的可能性。 >
> * 具有相同作用域變量通過一個var聲明。
>
>
>
> ~~~
> jQuery.extend = jQuery.fn.extend = function () {
> var options,
> name,
> src,
> copy,
> copyIsArray,
> clone,target = arguments[0] || {},
> i = 1,
> length = arguments.length,
> deep = false ;
> }
> ~~~
>
>
> * 緩存重復使用的全局變量。
>
>
> * 全局變量要比局部變量需要搜索的作用域長
>
> * 重復調用的方法也可以通過局部緩存來提速
>
> * 該項優化在IE上體現比較明顯
>
>
>
> ~~~
> var docElem = window.document.documentElement,
> selector_hasDuplicate,
> matches = docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector ||docElem.msMatchesSelector,
> selector_sortOrder = function ( a, b ) {
> // Flag for duplicate removal
> if ( a === b ) {
> selector_hasDuplicate = true ;
> return 0;
> }
> }
> ~~~
>
>
> * 善用回調。
>
>
> * 除了使用閉包進行內部變量訪問,我們還可以使用現在十分流行的回調函數來進行業務處理。
>
>
>
> ~~~
> function getData(callback) {
> var data = 'some big data';
>
> callback(null, data);
> }
>
> getData(function(err, data) {
> console.log(data);
> });
> ~~~
>
>
> * 回調函數是一種后續傳遞風格(`Continuation Passing Style`,?`CPS`)的技術,這種風格的程序編寫將函數的業務重點從返回值轉移到回調函數中去。而且其相比閉包的好處也有很多。
> * 如果傳入的參數是基礎類型(如字符串、數值),回調函數中傳入的形參就會是復制值,業務代碼使用完畢以后,更容易被回收。
> * 通過回調,我們除了可以完成同步的請求外,還可以用在異步編程中,這也就是現在非常流行的一種編寫風格。
> * 回調函數自身通常也是臨時的匿名函數,一旦請求函數執行完畢,回調函數自身的引用就會被解除,自身也得到回收。