国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

JavaScript中惰性函數的示例分析

發(fā)布時(shí)間:2021-07-27 11:48 來(lái)源:億速云 閱讀:0 作者:小新 欄目: web開(kāi)發(fā)

這篇文章主要介紹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í),將立刻刪除涉嫌侵權內容。

亚洲精品成人A8198A片漫画| 特级毛片a级毛片免费播放| 免费久久精品国产片| 无码乱人伦一区二区亚洲一| 激情五月开心婷婷深爱| 国产精品国产三级国AV|