- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) >
- JavaScript中惰性函數的示例分析
這篇文章主要介紹JavaScript中惰性函數的示例分析,文中介紹的非常詳細,具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
需求
我們現在需要寫(xiě)一個(gè) foo 函數,這個(gè)函數返回首次調用時(shí)的 Date 對象,注意是首次。
解決一:普通方法
var t; function foo() { if (t) return t; t = new Date() return t; }
問(wèn)題有兩個(gè),一是污染了全局變量,二是每次調用 foo 的時(shí)候都需要進(jìn)行一次判斷。
解決二:閉包
我們很容易想到用閉包避免污染全局變量。
var foo = (function() { var t; return function() { if (t) return t; t = new Date(); return t; } })();
然而還是沒(méi)有解決調用時(shí)都必須進(jìn)行一次判斷的問(wèn)題。
解決三:函數對象
函數也是一種對象,利用這個(gè)特性,我們也可以解決這個(gè)問(wèn)題。
function foo() { if (foo.t) return foo.t; foo.t = new Date(); return foo.t; }
依舊沒(méi)有解決調用時(shí)都必須進(jìn)行一次判斷的問(wèn)題。
解決四:惰性函數
不錯,惰性函數就是解決每次都要進(jìn)行判斷的這個(gè)問(wèn)題,解決原理很簡(jiǎn)單,重寫(xiě)函數。
var foo = function() { var t = new Date(); foo = function() { return t; }; return foo(); };
更多應用
DOM 事件添加中,為了兼容現代瀏覽器和 IE 瀏覽器,我們需要對瀏覽器環(huán)境進(jìn)行一次判斷:
// 簡(jiǎn)化寫(xiě)法 function addEvent (type, el, fn) { if (window.addEventListener) { el.addEventListener(type, fn, false); } else if(window.attachEvent){ el.attachEvent('on' + type, fn); } }
問(wèn)題在于我們每當使用一次 addEvent 時(shí)都會(huì )進(jìn)行一次判斷。
利用惰性函數,我們可以這樣做:
function addEvent (type, el, fn) { if (window.addEventListener) { addEvent = function (type, el, fn) { el.addEventListener(type, fn, false); } } else if(window.attachEvent){ addEvent = function (type, el, fn) { el.attachEvent('on' + type, fn); } } }
當然我們也可以使用閉包的形式:
var addEvent = (function(){ if (window.addEventListener) { return function (type, el, fn) { el.addEventListener(type, fn, false); } } else if(window.attachEvent){ return function (type, el, fn) { el.attachEvent('on' + type, fn); } } })();
當我們每次都需要進(jìn)行條件判斷,其實(shí)只需要判斷一次,接下來(lái)的使用方式都不會(huì )發(fā)生改變的時(shí)候,想想是否可以考慮使用惰性函數。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2 建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站