函数用法总结

函数是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阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,330评论 0 2
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,167评论 0 1
  • Sumproduct函数,用于返回相应数组或区域乘积的和,Sum代表求和,Product代表乘积。尽管该函数定义简...
    大鱼研习社阅读 21,143评论 0 5
  • 1、字符串和数值类型可以直接输出 2.变量 各种数据类型数值、布尔、列表和字典等都可以直接输出 3.格式化输出 类...
    qianyewhy阅读 6,270评论 0 2
  • DOM DOM内容主要分为四部分: 什么是DOM和节点; 获取节点; 节点操作(3种); 属性操作(3种)。 什么...
    magic_pill阅读 771评论 0 1