欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js閉包的用途詳解

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

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

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

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

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

2緩存

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

復制代碼 代碼如下:

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”)的時候,
我們就可以從緩存中取道該對象,而不用再去創(chuàng)建一個新的searchbox對象。

3 實現(xiàn)封裝

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

復制代碼 代碼如下:

var person = function(){   
    //變量作用域為函數(shù)內部,外部無法訪問   
    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 閉包的另一個重要用途是實現(xiàn)面向對象中的對象,傳統(tǒng)的對象語言都提供類的模板機制,
這樣不同的對象(類的實例)擁有獨立的成員及狀態(tài),互不干涉。雖然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閉包的作用了,非常簡單易懂吧,希望對小伙伴們有所幫助

相關文章

  • javascript類型系統(tǒng)——日期Date對象全面了解

    javascript類型系統(tǒng)——日期Date對象全面了解

    下面小編就為大家?guī)硪黄猨avascript類型系統(tǒng)——日期Date對象全面了解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 深入理解JavaScript系列(42):設計模式之原型模式詳解

    深入理解JavaScript系列(42):設計模式之原型模式詳解

    這篇文章主要介紹了深入理解JavaScript系列(42):設計模式之原型模式詳解,原型模式(prototype)是指用原型實例指向創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象,需要的朋友可以參考下
    2015-03-03
  • Javascript 布爾型分析

    Javascript 布爾型分析

    今天在做景德鎮(zhèn)的企業(yè)等級功能的時候,遇到一個很有趣的問題。在一個jsp頁面里,我需要把一個java的字符串轉為js的布爾型。
    2008-12-12
  • JavaScript數(shù)據(jù)結構和算法之二叉樹詳解

    JavaScript數(shù)據(jù)結構和算法之二叉樹詳解

    這篇文章主要介紹了JavaScript數(shù)據(jù)結構和算法之二叉樹詳解,本文講解了二叉樹的概念、二叉樹的特點、二叉樹節(jié)點的定義、查找最大和最小值等內容,需要的朋友可以參考下
    2015-02-02
  • JavaScript中Number.MIN_VALUE屬性的使用示例

    JavaScript中Number.MIN_VALUE屬性的使用示例

    這篇文章主要介紹了JavaScript中Number.MIN_VALUE屬性的使用示例,是JS入門學習中的基礎知識,需要的朋友可以參考下
    2015-06-06
  • 淺談JavaScript function函數(shù)種類

    淺談JavaScript function函數(shù)種類

    這篇文章主要介紹了JavaScript function函數(shù)種類,包括普通函數(shù)、匿名函數(shù)、閉包函數(shù)、十分的全面,并附上了示例,這里推薦給大家,希望對大家能有所幫助。
    2014-12-12
  • 輕松學習JavaScript函數(shù)中的 Rest 參數(shù)

    輕松學習JavaScript函數(shù)中的 Rest 參數(shù)

    ES6 引入 rest 參數(shù)用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對象了。rest 參數(shù)搭配的變量是一個數(shù)組,該變量將多余的參數(shù)放入數(shù)組中。下面我們來詳細了解一下吧
    2019-05-05
  • Javascript學習指南

    Javascript學習指南

    本文結合自己學習javascript的經(jīng)驗,向大家推薦了循序漸進的學習javascript的自學的軌跡,非常的合理,給有需要的小伙伴們參考下吧。
    2014-12-12
  • JavaScript for循環(huán) if判斷語句(學習筆記)

    JavaScript for循環(huán) if判斷語句(學習筆記)

    下面小編就為大家?guī)硪黄狫avaScript for循環(huán) if判斷語句(學習筆記)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 全面了解JavaScirpt 的垃圾(garbage collection)回收機制

    全面了解JavaScirpt 的垃圾(garbage collection)回收機制

    下面小編就為大家?guī)硪黄媪私釰avaScirpt 的垃圾(garbage collection)回收機制。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07

最新評論