函數用法總結

函數是Js中一等公民,其重要性不言而喻,現在我就把常用方法總結一下,希望大家能夠用到

函數中的緩存

? ? ? ?函數中的緩存起到很重要的作用,不僅僅提升性能,還能夠提升速度。對于一個函數來說特別重要,之前我做的一個項目,由于渲染的數據較多,當渲染數據達到200條的時候瀏覽器已經很卡頓了。我打開控制臺追溯源碼,發現發送請求兩次,new 每一個實例。第一步是把多余的請求注釋,第二步,把每一次實例分解,大致分三種數據,我就定義三個變量來存儲這三種類型數據。更改完代碼之后,直接渲染1000條數據不卡頓。瞬間覺得函數中的緩存還是相當重要 的。看一些這個代碼你就知道了

/**

* 函數緩存

* @fn {Function} 回掉函數

*

* */

var getSingle=function(fn){

? ? var result;

? ? return function(){

? ? ? ? ?return result || (result=fn.apply(this,arguments));

? ? }

}

var div=getSingle(function(){

? ? ? ? var dom_div=document.createElement("div");

? ? ? ? ?dom_div.innerHTML="我是彈出層";

? ? ? ? document.body.appendChild(dom_div);

? ? ? ? return dom_div;

});

div();//第一次調用返回新創建的div

div();//第二次調用返回緩存中的div

這個緩存方式是利用到閉包的特性,返回一個新的函數,這個函數中帶有getSingle函數中局部的變量 result引用。所有result會一直存在內存中。當我們第一次調用div()函數result值被賦值。第二次調用直接從內存中讀取result

函數鏈式調用

鏈式調用其實也很常用,如果你曾經已經把jQuery完爛,你對它的鏈式調用是否好奇。其實鏈式調用也是很簡單的。咱們看一個例子

/**

* 函數鏈式調用

* @elm 單個DOM節點

**/

var GetElm=function(elm){

? ? ? this.elm=elm || document.querySelector("body");

}

GetElm.prototype.setWidth=function(width){

? ? this.elm.style.width=width+"px";returnthis;

}

GetElm.prototype.setHeight=function(height){

? ? this.elm.style.height=height+"px";returnthis;

}

var dom=new GetElm(document.querySelector(".imag"));

dom.setHeight(400).setWidth(200);

首先定義了一個簡單的構造函數GetElm,然后在其原型擴展setWidth與setHeight方法。當我們實例一個GetElm以后。我們就可以使用setWidth與setHeight方法,大家已經發現setHeight與setWidth方法返回了this.這才是咱們實現鏈式調用的關鍵所在。

函數節流

函數節流對于我們來說太實用啦,因為我們開發頁面的時候經常會用到onresize,onscroll,onmousemove,如果這些事件中加雜大量的dom操作,瀏覽器肯定會卡頓。

//函數節流

/**

* 函數節流

* @fn {Function} 延遲執行函數

* @interval {Number} 延遲多久執行,默認值500毫秒

*

* */

var throttle=function(fn,interval){

? ? ? ?var _fn=fn || function(){},//保存需要延遲執行函數的引用

? ? ? ? timer,//定時器

? ? ? ? firstTime=true;//是否是第一次調用

return function(){

? ? ? ? ?var args=arguments,

? ? ? ? ?that=this;

? ? ? ?if(firstTime){//如果第一次執行不需要延遲

? ? ? ? ? ? _fn.apply(that,args);

? ? ? ? ? ? return firstTime=false;

? ? ? ?}

? ? ?if(timer){//如果定時器還在說明上一次執行還沒結束

? ? ? ? return false;

? ? }

? ? ? ?timer=setTimeout(function(){//延遲一段時間執行

? ? ? ? ? ? ? ?clearTimeout(timer);

? ? ? ? ? ? ? ?timer=null;

? ? ? ? ? ? ? _fn.apply(that,args);

? ? ? ? },interval || 500);

? ?}

}

window.onresize=throttle(function(){

? ? ? ?console.log("200");

},200)

有了函數throttle節流方法媽媽再也不用擔心我的瀏覽器會卡頓啦!這個節流函數也是用閉包實現的哦?。?!小伙伴們,下一篇內容咱就給你單獨講講閉包。

惰性加載函數

惰性加載函數功能猶如它的名字,它很懶,懶得以至于不想運行。哈哈,,,來看一下代碼吧!這段代碼之前你肯定經常用到,這是解決瀏覽器的兼容性而寫的。

` ` `

/**

* 惰性加載函數(一)

* 缺點:無論使用或者不使用,都要執行一次。

* @el 單個DOM節點

* @type {String} 事件名稱

* @handler {Function} 函數

*

* */

var addEvent=(function(win){

? ? ? if(win.addEventListener){

? ? ? ? ?return function(el,type,handler){

? ? ? ? ? ? ?el.addEventListener(type,handler,false);

? ? ? ? }

? ? ?}

? ?if(win.attachEvent){

? ? ? ? ?return function(el,type,handler){

? ? ? ? ? ? ?el.attachEvent("on"+type,handler);

? ?}

}

})(window)

/**

* 惰性加載函數(二)

* @el 單個DOM節點

* @type {String} 事件名稱

* @handler {Function} 函數

* 缺點:重新改寫原函數

* 優點:只有執行時才會改寫。

* */

var addEvent=function(el,type,handler){

? ? ? ? ? ?if(win.addEventListener){

? ? ? ? ? ? ? ? ? addEvent= function(el,type,handler){

? ? ? ? ? ? ? ? ? ?el.addEventListener(type,handler,false);

? ? ? ? ? ? ? ? ?}

? ? }else if(win.attachEvent){

? ? ? ? addEvent= function(el,type,handler){

? ? ? ? ?el.attachEvent("on"+type,handler);

? ?}

}

? ?addEvent(el,type,handler);

}

` ` `

惰性加載函數(一)比較勤快,所有呢!為了保證你的代碼能夠運行,你把這段代碼放在最上邊。這個函數其實也很簡單,瀏覽器加載則執行它,然后根據addEventListener與attachEvent的支持情況返回一個匿名函數給addEvent。你呢!只負責調用就行啦!它的缺點是最少執行一次。

惰性加載函數(二)跟它名字一樣,“不要跟我比懶,我懶得跟你比”。只有在你調用它的時候它會根據addEventListener與attachEvent的支持情況從寫addEvent函數。

總結

函數真的很重要,在你學習js的時候,你一定要深入去學習函數。沒有了函數可以說js跟廢物一樣。就拿上邊來看,它就幫我們解決了好多平時都經常遇到的問題。

代碼是一種神奇的東西,我們可以驅動它干好多事情。為什么我們不好好做一個控制者呢!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,957評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,248評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,081評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,485評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,720評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,263評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,025評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,204評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,461評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,945評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,205評論 2 375

推薦閱讀更多精彩內容

  • 1.JQuery 基礎 改變web開發人員創造搞交互性界面的方式。設計者無需花費時間糾纏JS復雜的高級特性。 1....
    LaBaby_閱讀 1,362評論 0 2
  • 1.JQuery 基礎 改變web開發人員創造搞交互性界面的方式。設計者無需花費時間糾纏JS復雜的高級特性。 1....
    LaBaby_閱讀 1,193評論 0 1
  • Sumproduct函數,用于返回相應數組或區域乘積的和,Sum代表求和,Product代表乘積。盡管該函數定義簡...
    大魚研習社閱讀 21,927評論 0 5
  • 1、字符串和數值類型可以直接輸出 2.變量 各種數據類型數值、布爾、列表和字典等都可以直接輸出 3.格式化輸出 類...
    qianyewhy閱讀 6,292評論 0 2
  • DOM DOM內容主要分為四部分: 什么是DOM和節點; 獲取節點; 節點操作(3種); 屬性操作(3種)。 什么...
    magic_pill閱讀 786評論 0 1