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

首頁 > 語言 > JavaScript > 正文

js閉包的用途詳解

2024-05-06 16:10:31
字體:
來源:轉載
供稿:網友
js閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。具體怎么理解呢,各位看官請仔細看好下文
 
 

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

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
国产亚洲激情视频在线| 亚洲国产另类 国产精品国产免费| 色婷婷久久一区二区| 欧美性视频网站| 欧美第一黄网免费网站| 亚洲免费视频一区二区| 日本a级片电影一区二区| 国产精品自产拍在线观看| 成人国产精品免费视频| 国产精品亚洲аv天堂网| www日韩欧美| 1769国产精品| 中文字幕最新精品| 51精品国产黑色丝袜高跟鞋| 国产精品99久久久久久白浆小说| 中文欧美在线视频| 欧美综合国产精品久久丁香| 国语自产精品视频在线看抢先版图片| 久久视频这里只有精品| 日本亚洲欧洲色| 国产精品色视频| 欧美激情影音先锋| 日韩美女中文字幕| 日韩av电影免费观看高清| 欧美乱人伦中文字幕在线| 久久在精品线影院精品国产| 中文字幕亚洲综合久久筱田步美| 亚洲人免费视频| 精品国产福利在线| 国产精品爽黄69| 日本韩国欧美精品大片卡二| 国产噜噜噜噜久久久久久久久| 亚洲成人激情在线观看| 亚洲春色另类小说| 日韩中文字幕免费看| 欧美老少配视频| 日本久久久久久久| 91高清视频免费观看| 国产色视频一区| 中文一区二区视频| 搡老女人一区二区三区视频tv| 亚洲一区www| 91香蕉电影院| 亚洲电影免费观看高清完整版在线| 成人有码在线视频| 成人观看高清在线观看免费| 国产精品影片在线观看| 亚洲一区二区三区成人在线视频精品| 国产精品久久久久久久app| 亚洲欧美日韩久久久久久| 美女啪啪无遮挡免费久久网站| 超碰97人人做人人爱少妇| 国产成人精品电影| 97视频在线观看视频免费视频| 日韩二区三区在线| 欧美与黑人午夜性猛交久久久| 伊人久久男人天堂| 91精品视频观看| www.亚洲免费视频| 欧美大秀在线观看| 久久久久久久久久久网站| 国产一区二区视频在线观看| 亚洲综合在线小说| 亚洲a在线播放| 国产精品九九九| 精品国产鲁一鲁一区二区张丽| 精品成人国产在线观看男人呻吟| 亚洲国模精品私拍| 日韩精品在线观看一区二区| 不卡在线观看电视剧完整版| 久久久亚洲国产天美传媒修理工| 亚洲精品国产精品国自产观看浪潮| 精品亚洲一区二区| 欧美日韩亚洲一区二区| 国内精品免费午夜毛片| 另类视频在线观看| 久久视频国产精品免费视频在线| 亚洲iv一区二区三区| 国产精品久久久久久久av大片| 精品久久久久久久久久国产| 国产精品99久久久久久www| 国产精品亚洲视频在线观看| 欧美激情精品在线| 国产一区二区三区在线观看网站| 欧美日韩国产成人在线观看| 国产一区二区三区视频免费| 国产成人免费av| 高清一区二区三区日本久| 亚洲综合av影视| 国产精品一区二区女厕厕| 久久精品中文字幕电影| 韩国三级日本三级少妇99| 日韩电影在线观看免费| 国产在线一区二区三区| 色综合久久天天综线观看| 成人伊人精品色xxxx视频| 亚洲伦理中文字幕| 亚洲老头同性xxxxx| 在线激情影院一区| 久久国产精品网站| 国产精品爽爽爽| 国产精品第七十二页| 97香蕉超级碰碰久久免费软件| 日本久久久a级免费| 亚洲成人精品视频在线观看| 日韩av日韩在线观看| 亚洲色在线视频| 久久精品最新地址| 欧美大片欧美激情性色a∨久久| 亚洲欧洲xxxx| 久久久久久有精品国产| 久久久久久久一区二区| 成人国产在线视频| 欧美日韩国产中文字幕| 97av在线视频免费播放| 久久久久久久久国产精品| 91国语精品自产拍在线观看性色| 另类天堂视频在线观看| 久久成年人免费电影| 日韩精品亚洲视频| 韩日精品中文字幕| 国产精品网址在线| 欧美激情久久久久久| 欧美野外猛男的大粗鳮| 精品毛片网大全| 国产福利成人在线| 亚洲国产91精品在线观看| www.99久久热国产日韩欧美.com| 日本不卡高字幕在线2019| 91在线直播亚洲| 欧美电影《睫毛膏》| 亚洲色图50p| 国产成人精品电影久久久| 欧美日韩激情小视频| 国产性猛交xxxx免费看久久| 日本sm极度另类视频| 欧美成人精品xxx| 色无极影院亚洲| 久久久亚洲天堂| 亚洲精品一区在线观看香蕉| 久久色在线播放| 亚洲精品videossex少妇| 国产精品欧美风情| 亚洲片在线观看| 欧美亚洲国产日韩2020| 中文字幕欧美精品日韩中文字幕| 亚洲自拍偷拍福利| 国产精品黄页免费高清在线观看| 国产成人精品av在线| 亚洲成色777777在线观看影院| 在线视频日本亚洲性| 日韩av黄色在线观看| 亚洲高清久久网| 欧美在线视频一区二区| 国产在线观看精品| 一区二区三区视频在线| 一区二区三欧美| 午夜精品久久久久久久白皮肤| 亚洲欧美制服另类日韩| 欧美成在线视频| 欧美电影在线观看网站| 伊人亚洲福利一区二区三区| 中文字幕在线看视频国产欧美| 亚洲国产精品系列|