(function() {
// 塊級做用域
})();
// 訪問不到塊級做用域
複製代碼
這種方法能夠限制向全局做用域中添加過多的變量和函數,同時還能夠減小閉包占用的內存問題,由於沒有指向匿名函數的引用。只要函數執行完畢就能夠當即銷燬做用域鏈。javascript
默認狀況下,函數內部的變量是私有的,外部訪問不到。 若是在函數內部建立一個閉包,閉包則能夠訪問這些內部變量。 經過這個原理,能夠建立用於訪問私有變量的公有方法。java
特權方法:能夠訪問私有變量和私有函數的公有方法api
建立私有變量的方法:閉包
// 在構造函數內部定義了私有變量name
// 定義了特權方法getName setName
// 特權方法做爲閉包有權訪問name
// 每一個實例的name都是獨立的
// 每一個實例的特權方法也是從新建立的,沒法共享,這也是缺點所在
function Person(name) {
this.getName = function() {
return name;
};
this.setName = function(value) {
name = value;
}
}
var tc = new Person('tc');
var dj = new Person('dj');
tc.getName(); // tc
dj.getName(); // dj
複製代碼
優勢: 每一個實例都有本身的私有變量 缺點: 必須使用構造函數模式,針對每一個實例都會建立一樣一組新方法函數
// 當即執行函數建立了一個私有做用域
// name爲私有變量
// Person沒有使用函數聲明,而是函數表達式,是由於函數聲明只能定義局部函數,在這裏是定義私有方法才用的
// Person沒有用var定義,默認爲全局變量
// 特權方法定義在原型上,因此能夠被實例共享
// 可是私有變量被全部實例共享,一個實例改變了私有變量,其餘實例均受影響,因此這也是缺點
(function() {
var name = '';
Person = function(value) {
name = value;
};
Person.prototype.getName = function() {
return name;
};
Person.prototype.setName = function(value) {
name = value;
};
})();
var tc = new Person('tc');
tc.getName(); // tc
var dj = new Person('dj');
tc.getName(); // dj
複製代碼
優勢: 公有方法是全部實例共享的 缺點: 私有變量是靜態的(由全部實例共享)this
以前的模式都使用了new操做符,因此是用於自定義類型建立私有變量和特權方法的。 模塊模式則是爲單例建立私有變量和特權方法的。spa
// 當即執行函數返回一個對象
// 這個對象提供特權方法的接口api
var person = (function() {
// 初始化
// 私有變量
var name = 'tc';
return {
getName: function() {
return name;
},
setName: function(value) {
name = value;
}
}
})();
複製代碼
這種模式在爲單例進行初始化,同時維護私有變量時很是有用。prototype