最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js閉包的用途詳解

 更新時(shí)間:2014年11月09日 09:50:24   投稿:hebedich  
js閉包可以用在許多地方。它的最大用處有兩個(gè),一個(gè)是前面提到的可以讀取函數(shù)內(nèi)部的變量,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中。具體怎么理解呢,各位看官請(qǐng)仔細(xì)看好下文

我們來看看閉包的用途。事實(shí)上,通過使用閉包,我們可以做很多事情。比如模擬面向?qū)ο蟮拇a風(fēng)格;更優(yōu)雅,更簡(jiǎn)潔的表達(dá)出代碼;在某些方面提升代碼的執(zhí)行效率。

1 匿名自執(zhí)行函數(shù)

我們知道所有的變量,如果不加上var關(guān)鍵字,則默認(rèn)的會(huì)添加到全局對(duì)象的屬性上去,這樣的臨時(shí)變量加入全局對(duì)象有很多壞處,
比如:別的函數(shù)可能誤用這些變量;造成全局對(duì)象過于龐大,影響訪問速度(因?yàn)樽兞康娜≈凳切枰獜脑玩溕媳闅v的)。
除了每次使用變量都是用var關(guān)鍵字外,我們?cè)趯?shí)際情況下經(jīng)常遇到這樣一種情況,即有的函數(shù)只需要執(zhí)行一次,其內(nèi)部變量無需維護(hù),
比如UI的初始化,那么我們可以使用閉包:

復(fù)制代碼 代碼如下:

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);  

我們創(chuàng)建了一個(gè)匿名的函數(shù),并立即執(zhí)行它,由于外部無法引用它內(nèi)部的變量,
因此在執(zhí)行完后很快就會(huì)被釋放,關(guān)鍵是這種機(jī)制不會(huì)污染全局對(duì)象。

2緩存

再來看一個(gè)例子,設(shè)想我們有一個(gè)處理過程很耗時(shí)的函數(shù)對(duì)象,每次調(diào)用都會(huì)花費(fèi)很長(zhǎng)時(shí)間,
那么我們就需要將計(jì)算出來的值存儲(chǔ)起來,當(dāng)調(diào)用這個(gè)函數(shù)的時(shí)候,首先在緩存中查找,如果找不到,則進(jìn)行計(jì)算,
然后更新緩存并返回值,如果找到了,直接返回查找到的值即可。閉包正是可以做到這一點(diǎn),因?yàn)樗粫?huì)釋放外部的引用,
從而函數(shù)內(nèi)部的值可以得以保留。

復(fù)制代碼 代碼如下:

var CachedSearchBox = (function(){   
    var cache = {},   
       count = [];   
    return {   
       attachSearchBox : function(dsid){   
           if(dsid in cache){//如果結(jié)果在緩存中   
              return cache[dsid];//直接返回緩存中的對(duì)象   
           }   
           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");   

這樣,當(dāng)我們第二次調(diào)用CachedSearchBox.attachSerachBox(“input1”)的時(shí)候,
我們就可以從緩存中取道該對(duì)象,而不用再去創(chuàng)建一個(gè)新的searchbox對(duì)象。

3 實(shí)現(xiàn)封裝

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

復(fù)制代碼 代碼如下:

var person = function(){   
    //變量作用域?yàn)楹瘮?shù)內(nèi)部,外部無法訪問   
    var name = "default";      
      
    return {   
       getName : function(){   
           return name;   
       },   
       setName : function(newName){   
           name = newName;   
       }   
    }   
}();   
    
print(person.name);//直接訪問,結(jié)果為undefined   
print(person.getName());   
person.setName("abruzzi");   
print(person.getName());   

得到結(jié)果如下: 
  
undefined 
default 
abruzzi 
 
4 閉包的另一個(gè)重要用途是實(shí)現(xiàn)面向?qū)ο笾械膶?duì)象,傳統(tǒng)的對(duì)象語言都提供類的模板機(jī)制,
這樣不同的對(duì)象(類的實(shí)例)擁有獨(dú)立的成員及狀態(tài),互不干涉。雖然JavaScript中沒有類這樣的機(jī)制,但是通過使用閉包,
我們可以模擬出這樣的機(jī)制。還是以上邊的例子來講:

復(fù)制代碼 代碼如下:

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());   

運(yùn)行結(jié)果如下: 
  
default 
john 
default 
jack 
由此代碼可知,john和jack都可以稱為是Person這個(gè)類的實(shí)例,因?yàn)檫@兩個(gè)實(shí)例對(duì)name這個(gè)成員的訪問是獨(dú)立的,互不影響的。

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

相關(guān)文章

最新評(píng)論

美姑县| 巴彦淖尔市| 涞水县| 墨脱县| 依安县| 平果县| 福贡县| 离岛区| 武功县| 鄯善县| 晋城| 宣武区| 中卫市| 武山县| 陕西省| 玉山县| 五华县| 乐清市| 图木舒克市| 伊春市| 枞阳县| 明星| 南宁市| 商丘市| 元江| 乐亭县| 博客| 万山特区| 金寨县| 固原市| 盐边县| 靖安县| 澎湖县| 开江县| 梨树县| 松滋市| 商南县| 确山县| 扎鲁特旗| 高唐县| 麻栗坡县|