1. 程式人生 > >JavaScript函數表達式

JavaScript函數表達式

局部變量 return class rip public eval 有一個 變量 prototype

閉包

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

匿名函數的執行環境具有全局性。外圍函數返回的匿名函數僅僅是定義,還尚未執行;函數內部的this對象指向函數據以執行的環境對象,當匿名函數被執行時,返回的匿名函數所處的執行環境是全局環境,故而this指向全局環境的變量對象。

var name = "Bob";

function out() {
    var name = "Tom";
    
    return function() {
        return this.name;
    }
    
}

alert(out()()); // Bob

函數表達式

如果function關鍵字是語句的開始,則這是一個函數聲明。若要將函數聲明轉為函數表達式只需要用"()"括住函數聲明即可。

私有變量

任何在函數中定義的變量,都可以認為是私有變量。私有變量包括函數的參數、局部變量和函數內部定義的其他函數。

特權方法指有權訪問私有變量和私有函數的公有方法。

創建私有變量的常用方法是構造函數模式:

function Test(name) {
    var age = 24;
    this.sayName = function() {
        return name;
    };
}

alert(new Test("Tom").sayName()); // Tom
alert(new Test("Tom").age); // undefined

構造函數內部的age、name是私有變量,不是實例變量(this.valueName),實例方法sayName是特權方法,能夠訪問name私有變量。

靜態私有變量

為了解決創建多個實例時會重復創建特權方法的問題,可以:

  1. 在匿名函數表達式中定義私有變量和私有函數
  2. 創建全局變量對象,並用匿名構造函數初始化
  3. 在全局變量的原型中定義公有方法
(function() {
    var privateValue = 24;
    function privateFunction() {
        alert("Hello,world!");
    }
    
    // 用匿名構造函數初始化全局對象
    Obj = function(){
        
    };
    
    Obj.prototype.publicMethod = function() {
        alert(privateValue);
        privateFunction();
    };
})();

m = new Obj();
m.publicMethod();

模塊模式

模塊模式是為單例創建私有變量和特權方法。

所謂單例,指的就是只有一個實例的對象。按照慣例,JavaScript以對象字面量來創建單例對象。

  1. 在匿名函數中定義私有變量和私有函數
  2. 匿名函數返回一個對象字面量形式的對象
  3. 在對象字面量中定義特權方法和公有變量
(function() {
    var privateValue = 24;
    function privateFunction() {
        alert("Hello,world!");
    }

    return {
        publicProperty: "public",
        publicMethod:  function() {
            alert(privateValue);
            privateFunction();
        }
    };
})().publicMethod();

增強模塊模式

增強模式返回的單例都是Object類型的,如果需要特定類型的單例,可以使用增強模塊模式:

  1. 在匿名函數中定義私有變量和私有函數
  2. 在匿名函數中,創建特定類型的單例對象
  3. 為單例對象添加特權方法和公有屬性
  4. 返回單例對象
test = (function() {
    var privateValue = 24;
    function privateFunction() {
        alert("Hello,world!");
    }
    Bob = new Student();
    Bob.publicProperty = "public",
    Bob.publicMethod =  function() {
        alert(privateValue);
        privateFunction();
    };
    return Bob;
})();

function Student() {
    
}

test.publicMethod();
alert(test instanceof Student); // true

JavaScript函數表達式