亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js閉包的用途詳解

2019-11-20 13:56:32
字體:
來源:轉載
供稿:網友

我們來看看閉包的用途。事實上,通過使用閉包,我們可以做很多事情。比如模擬面向對象的代碼風格;更優雅,更簡潔的表達出代碼;在某些方面提升代碼的執行效率。

1 匿名自執行函數

我們知道所有的變量,如果不加上var關鍵字,則默認的會添加到全局對象的屬性上去,這樣的臨時變量加入全局對象有很多壞處,
比如:別的函數可能誤用這些變量;造成全局對象過于龐大,影響訪問速度(因為變量的取值是需要從原型鏈上遍歷的)。
除了每次使用變量都是用var關鍵字外,我們在實際情況下經常遇到這樣一種情況,即有的函數只需要執行一次,其內部變量無需維護,
比如UI的初始化,那么我們可以使用閉包:

復制代碼 代碼如下:

var datamodel = {   
    table : [],   
    tree : {}   
};   
    
(function(dm){   
    for(var i = 0; i < dm.table.rows; i++){   
       var row = dm.table.rows[i];   
       for(var j = 0; j < row.cells; i++){   
           drawCell(i, j);   
       }   
    }   
      
    //build dm.tree     
})(datamodel);  

我們創建了一個匿名的函數,并立即執行它,由于外部無法引用它內部的變量,
因此在執行完后很快就會被釋放,關鍵是這種機制不會污染全局對象。

2緩存

再來看一個例子,設想我們有一個處理過程很耗時的函數對象,每次調用都會花費很長時間,
那么我們就需要將計算出來的值存儲起來,當調用這個函數的時候,首先在緩存中查找,如果找不到,則進行計算,
然后更新緩存并返回值,如果找到了,直接返回查找到的值即可。閉包正是可以做到這一點,因為它不會釋放外部的引用,
從而函數內部的值可以得以保留。

復制代碼 代碼如下:

var CachedSearchBox = (function(){   
    var cache = {},   
       count = [];   
    return {   
       attachSearchBox : function(dsid){   
           if(dsid in cache){//如果結果在緩存中   
              return cache[dsid];//直接返回緩存中的對象   
           }   
           var fsb = new uikit.webctrl.SearchBox(dsid);//新建   
           cache[dsid] = fsb;//更新緩存   
           if(count.length > 100){//保正緩存的大小<=100   
              delete cache[count.shift()];   
           }   
           return fsb;         
       },   
    
       clearSearchBox : function(dsid){   
           if(dsid in cache){   
              cache[dsid].clearSelection();     
           }   
       }   
    };   
})();   
    
CachedSearchBox.attachSearchBox("input1");   

這樣,當我們第二次調用CachedSearchBox.attachSerachBox(“input1”)的時候,
我們就可以從緩存中取道該對象,而不用再去創建一個新的searchbox對象。

3 實現封裝

可以先來看一個關于封裝的例子,在person之外的地方無法訪問其內部的變量,而通過提供閉包的形式來訪問:

復制代碼 代碼如下:

var person = function(){   
    //變量作用域為函數內部,外部無法訪問   
    var name = "default";      
      
    return {   
       getName : function(){   
           return name;   
       },   
       setName : function(newName){   
           name = newName;   
       }   
    }   
}();   
    
print(person.name);//直接訪問,結果為undefined   
print(person.getName());   
person.setName("abruzzi");   
print(person.getName());   

得到結果如下: 
  
undefined 
default 
abruzzi 
 
4 閉包的另一個重要用途是實現面向對象中的對象,傳統的對象語言都提供類的模板機制,
這樣不同的對象(類的實例)擁有獨立的成員及狀態,互不干涉。雖然JavaScript中沒有類這樣的機制,但是通過使用閉包,
我們可以模擬出這樣的機制。還是以上邊的例子來講:

復制代碼 代碼如下:

function Person(){   
    var name = "default";      
      
    return {   
       getName : function(){   
           return name;   
       },   
       setName : function(newName){   
           name = newName;   
       }   
    }   
};   
    
    
var john = Person();   
print(john.getName());   
john.setName("john");   
print(john.getName());   
    
var jack = Person();   
print(jack.getName());   
jack.setName("jack");   
print(jack.getName());   

運行結果如下: 
  
default 
john 
default 
jack 
由此代碼可知,john和jack都可以稱為是Person這個類的實例,因為這兩個實例對name這個成員的訪問是獨立的,互不影響的。

以上便是js閉包的作用了,非常簡單易懂吧,希望對小伙伴們有所幫助

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品福利樱桃av导航| 成人观看高清在线观看免费| 久久综合九色九九| 欧美放荡办公室videos4k| 亚洲日本aⅴ片在线观看香蕉| 8x海外华人永久免费日韩内陆视频| 久久69精品久久久久久国产越南| 亚洲深夜福利网站| 国产亚洲精品美女| 久久精品亚洲一区| 国产精品久久久久久久久免费看| 欧美激情一二区| 亚洲最新视频在线| 国产综合福利在线| 日韩av免费在线| 欧美精品videossex性护士| 韩剧1988免费观看全集| 国产精品久久久久久亚洲影视| 国产91精品青草社区| 中文字幕在线视频日韩| 日韩精品视频免费| 欧美成年人视频网站| 亚洲一区中文字幕| 久久久久久九九九| 国产精品男女猛烈高潮激情| 精品国产乱码久久久久久天美| 亚洲电影免费观看高清完整版在线| 国产亚洲欧洲高清| 久久久久一本一区二区青青蜜月| 欧美激情极品视频| 久久国产精品久久久久久| 国产视频精品自拍| 国产精品精品视频一区二区三区| 亚洲另类xxxx| 最新69国产成人精品视频免费| 91牛牛免费视频| 91免费看视频.| 欧美黄网免费在线观看| 日本一区二区不卡| 亚洲欧美色婷婷| 久久91精品国产91久久久| 97视频在线观看视频免费视频| 456国产精品| 精品毛片网大全| 国产精品露脸自拍| 久久免费视频这里只有精品| 久久99青青精品免费观看| 亚洲视频网站在线观看| 精品在线欧美视频| 成人免费大片黄在线播放| 尤物99国产成人精品视频| 亚洲系列中文字幕| 亚洲资源在线看| 日本一本a高清免费不卡| 国产免费成人av| 欧美成人性色生活仑片| 欧美激情国产精品| 国产精品视频内| 国产91在线高潮白浆在线观看| 久久久爽爽爽美女图片| 午夜精品福利在线观看| 国产日韩在线看片| 久久人人爽亚洲精品天堂| 国产精品视频xxx| 日韩av影片在线观看| 欧美日韩国产中文字幕| 欧美午夜性色大片在线观看| 欧美国产精品va在线观看| 中文.日本.精品| 一本一道久久a久久精品逆3p| 欧美色欧美亚洲高清在线视频| 伊人伊成久久人综合网站| 久久精品色欧美aⅴ一区二区| 日本欧美在线视频| 精品久久久久久久久久国产| 国产成人一区二区三区小说| 色偷偷888欧美精品久久久| 97免费中文视频在线观看| 欧美一区二区三区免费观看| 色综合久久精品亚洲国产| 国产精品成av人在线视午夜片| 成人激情电影一区二区| 尤物九九久久国产精品的特点| 久久人人爽国产| 亚洲一区二区三区xxx视频| 欧美日韩成人免费| 777777777亚洲妇女| 国产精品都在这里| 欧美电影免费观看网站| 亚洲男人的天堂在线播放| 热99久久精品| 国产精品入口夜色视频大尺度| 菠萝蜜影院一区二区免费| 亚洲欧美日韩中文视频| 色香阁99久久精品久久久| 精品国产电影一区| 亚洲精品国偷自产在线99热| 久久成人精品视频| 色婷婷久久一区二区| 日av在线播放中文不卡| 国产成人av网址| 亚洲综合在线做性| 亚洲一区av在线播放| 精品国产自在精品国产浪潮| 日韩欧美大尺度| 北条麻妃99精品青青久久| 欧美精品在线观看91| 国产精品视频男人的天堂| 国产精品成久久久久三级| 萌白酱国产一区二区| 久久69精品久久久久久国产越南| 日韩欧美国产中文字幕| 中文字幕在线观看亚洲| 久久久999成人| 日韩第一页在线| 色狠狠av一区二区三区香蕉蜜桃| 亚洲电影免费在线观看| 91av视频在线观看| 成人一区二区电影| 2019亚洲男人天堂| 日韩成人网免费视频| 国产精品嫩草影院一区二区| 777国产偷窥盗摄精品视频| 日韩精品视频在线观看免费| 欧美野外猛男的大粗鳮| 热久久这里只有精品| 亚洲国产精彩中文乱码av| 亚洲激情 国产| 久久久久久久香蕉网| 亚洲第一精品电影| 91极品视频在线| 国产美女精品视频免费观看| 黑人巨大精品欧美一区二区一视频| 高跟丝袜一区二区三区| 久久久久日韩精品久久久男男| 91久久精品美女| 韩国视频理论视频久久| 欧美最猛性xxxxx(亚洲精品)| 亚洲字幕一区二区| 精品国产乱码久久久久久虫虫漫画| 亚洲午夜久久久久久久| 久久久久久综合网天天| 亚洲欧美一区二区三区情侣bbw| 久久免费国产精品1| 精品国产欧美成人夜夜嗨| 亚洲一区二区黄| 亚洲精品一区中文| 亚洲大胆美女视频| 国产色综合天天综合网| 欧美成人中文字幕在线| 亚洲成人黄色在线观看| 国产成人精品在线观看| 中文字幕精品www乱入免费视频| 狠狠色狠狠色综合日日小说| 91黑丝在线观看| 国产精品高清在线观看| 国产一区二区三区毛片| 国产精品免费在线免费| 秋霞午夜一区二区| 亚洲免费中文字幕| 69久久夜色精品国产69| 亚洲欧美日本另类| 国产精品专区第二| 久久久999精品|