標籤:c style class blog code java
封裝是物件導向的基礎,今天所要學習的匿名函數與閉包就是為了實現JS的物件導向封裝。封裝實現、封裝變數,提高資料、系統安全性,封裝正是物件導向的基礎。
匿名函數
即沒有名字的函數,其建立方式為
function(){...}
單獨存在的匿名函數,無法運行,可通過賦值給變數調用或通過運算式自我執行來實現運行。
1.賦值給變數為一般的函數使用方式
var run = function(){
return ‘方法運行中‘;
};
alert(run());
2.通過運算式自我執行
(function(arguments可選)
{
alert(‘方法運行中‘);
})(arguments);
閉包
在一個普通函數的內部,建立一個匿名函數,匿名函數可訪問普通函數中的變數,進而實作類別似於物件導向中封裝的特性,這個匿名函數就叫做對應普通函數的閉包。閉包就是對外建立的介面,通過介面達到訪問函數內部變數的效果。
functionrun() {
varusername = ‘Forrest‘;
return function () { //通過匿名函數返回 box()局部變數
returnusername;
};
}
//alert(username); //錯誤username is not defined
alert(run()());
特點:閉包中使用的局部變數會駐留在記憶體中,避免了使用全域變數造成的命名衝突等情況的發生。值得注意的是閉包中使用this關鍵字,指向的是window對象。
封裝
為了更好的安全性、資料保護,則需要對資料進行私人化的封裝,而JS中沒有塊級範圍的概念(即出了{}的範圍,仍可以訪問聲明的變數),但有了前面的基礎,我們就可以達到像其他正規物件導向語言的封裝效果。
function user(){ (function(){ for(i = 0; i<5; i++){ alert(i); } })(); alert(i); //此處無法訪問變數i } //私人範圍代替全域變數 (function(){ var username= 'Forrest'; alert(username); })(); //匿名函數執行完畢後,變數立即銷毀 //訪問私人變數 function User(){ var username= Forrest; //私人變數 function learn(){ //私人函數 return '學習中'; }; //對外提供介面,間接訪問內部成員 this.userlearn = function(){ return username + learn(); }; } var user = new User() alert(user.userlearn()); //實現get()、set() function User(value){ var user = value; this.getUser = function(){ return user; } this.setUser = function(value){ user = value; } } var user = new User('Forrest'); alert(user.getUser()); user.setUser('Li'); alert(user.getUser()); //靜態私人變數 (function(){ var user = ''; User = function(value){ user = value; }; Box.prototype.getUser = function(){ return user; }; Box.prototype.setUser = function(value){ user = valu; }; })(); //字面量方式的私人化 function NormalUser(){} var user = function(){ var user = 'Forrest'; function learn(){ return user + '學習中...'; }; var nu = new NormalUser(); nu.userlearn = function(){ return learn(); }; return nu; }(); alert(user.userlearn());
中結:
JS雖不是一門正統的物件導向的語言,但用它也能達到物件導向的封裝、繼承、多態等的效果,學習起來還是需要好好理解的,特別是對於使用JS不是特別多的人來說,只能等到以後的逐步應用來解決這一系列的問題,更進一步體會它在物件導向方面的應用。