JavaScript學習要點(六)

函數聲明提升代表執行代碼前會先讀取函數聲明

但函數表達式並不會被提前讀取

編寫遞歸函數時使用arguments.callee比使用函數名更保險,在嚴格模式下不能通過腳本訪問arguements.callee,可以使用命名函數表達式來達成相同的結果

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

閉包是隻有權訪問另一個函數作用域中的變量的函數

function createFunctions(){
    var result = new Array();
    for (var i = 0; i < 10; i++) {
        result[i] = function(num){
            return num;
        }(i);
    };
    return result;
}

通過在返回的函數裏調用外部運行環境來返回相應運行環境內的變量

JS中沒有塊級作用域的概念,從它有定義開始,就可以在函數的內部隨處訪問它,即便重新定義也沒啥用,而且也不會提醒你

模仿塊級作用域的方法
(function(){
    //這裏是塊級作用域
})();

當我們需要臨時變量的時候就可以採用這種方法

任何在函數中定義的變量都可以認爲是私有變量,有權訪問私有變量和函數的被稱爲特權方法

function Person(name){
    this.getname = function(){
        return name;
    };
    this.setname = function(value){
        name = value;
    };
}

var person = new Person("A");
person.getname() //A
person.setname("B") 
person.getname() //B

通過使用靜態私有變量可以實現方法的共用來避免由於構造函數每個實例都會創建同樣的一組方法

在這種方式下,私有變量和函數是由實例共享的,但特權方法定義在原型上,增進了代碼複用但每個實例都沒有了自己的私有變量

JS通過對象字面量的方式來創建單例對象,使用模塊模式返回對象的匿名函數,返回的對象中只包含可以公開的屬性和方法,這個對象是在匿名函數內部定義的,所以可以訪問私有變量和函數,這個對象字面量定義的是單例的公共接口,可對單例進行某些初始化同時又可維護其私有變量

var application = function(){
    var components = new Array();
    components.push(new BaseComponent());
    var app = new BaseComponent();

    app.getComponentCount = function(){
        return components.length;
    }

    app.registerComponent = function(component){
        if (typeof components == "object"){
            components.push(component)
        }
    };
    return app;
}();
發佈了45 篇原創文章 · 獲贊 2 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章