《JavaScript高級程序設計》讀書筆記--7-函數表達式

兩種方式定義函數:函數聲明和函數表達式
函數聲明的一個重要特徵就是函數聲明提升,意思是在執行代碼前會先讀取函數聲明。
而函數表達式在使用前必須先賦值。

遞歸

遞歸函數是在一個函數通過名字調用自身的情況下構成的。

var factorial = (function f(num){
    if(num<=1){
        return 1;
    }else{
        return num*f(num-1);
    }
});

創建一個名爲f()的命名函數表達式,然後將它賦值給變量factorial,即便把函數賦值給了另一個變量,函數名字f仍然有效,所以遞歸調用照樣能夠完成。

閉包

閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的常見方式就是在一個函數內部創建另一個函數。

function createComparisonFunction(propertyName){
    return function(object1,object2){
        var value1 = object1[propertyName];//內部函數
        var value2 = object2[propertyName];//內部函數
        if(value1<value2){
            return -1;
        }else if(value1>value2){
            return 1;
        }else{
        return 0;
        }
    };
}

閉包與變量
閉包只能取得包含函數中任何變量的最後一個值。閉包所保存的使整個變量對象,而不是某個特殊的變量。
關於this對象
匿名函數的執行環境具有全局性,因此this對象通常指向window。
內存泄漏
如果閉包的作用域鏈中保存着一個HTMl元素,那麼意味着該元素將無法被銷燬。

模仿塊級作用域

(function(){
    //這裏是塊級作用域
})();

這種技術經常在全局作用域中被用在函數外部,從而限制向全局作用域中添加過多的變量和函數。

私有變量

嚴格來講,js沒有私有成員的概念,所有對象屬性都是公有的,不過,倒是有一個私有變量的概念,任何在函數中定義的變量,都可以認爲是私有變量,因爲不能在函數外部訪問這些變量。私有變量包括函數的參數、局部變量和在函數內部定義的其他函數。
把有權訪問私有變量和私有方法的公有方法稱之爲特權方法。
特權方法

靜態私有變量
通過在私有作用域中定義私有變量或函數,同樣也可以創建特權方法。
靜態私有變量

模塊模式
是爲單例創建私有變量和特權方法,所謂單例指的就是隻有一個實例的對象。
增強的模塊模式
】即在返回對象之前加入對其增強的代碼。

發佈了42 篇原創文章 · 獲贊 58 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章