JavaScript函數表達式
阿新 • • 發佈:2018-10-19
局部變量 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私有變量。
靜態私有變量
為了解決創建多個實例時會重復創建特權方法的問題,可以:
- 在匿名函數表達式中定義私有變量和私有函數
- 創建全局變量對象,並用匿名構造函數初始化
- 在全局變量的原型中定義公有方法
(function() { var privateValue = 24; function privateFunction() { alert("Hello,world!"); } // 用匿名構造函數初始化全局對象 Obj = function(){ }; Obj.prototype.publicMethod = function() { alert(privateValue); privateFunction(); }; })(); m = new Obj(); m.publicMethod();
模塊模式
模塊模式是為單例創建私有變量和特權方法。
所謂單例,指的就是只有一個實例的對象。按照慣例,JavaScript以對象字面量來創建單例對象。
- 在匿名函數中定義私有變量和私有函數
- 匿名函數返回一個對象字面量形式的對象
- 在對象字面量中定義特權方法和公有變量
(function() {
var privateValue = 24;
function privateFunction() {
alert("Hello,world!");
}
return {
publicProperty: "public",
publicMethod: function() {
alert(privateValue);
privateFunction();
}
};
})().publicMethod();
增強模塊模式
增強模式返回的單例都是Object類型的,如果需要特定類型的單例,可以使用增強模塊模式:
- 在匿名函數中定義私有變量和私有函數
- 在匿名函數中,創建特定類型的單例對象
- 為單例對象添加特權方法和公有屬性
- 返回單例對象
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函數表達式