需求

我们现在需要写一个 foo 函数 ,这个函数返回首次调用时的Date对象,注意是首次

解决一:普通方法

var t;
function foo() {if (t) return t;t = new Date()return t;
}

问题有两个,一是污染了全局变量,二是每次调用foo的时候都需要进行一次判断

解决二:闭包

我们很容易想到用闭包避免污染全局变量

var foo = (function() {var t;return function() {if (t) return t;t = new Date();return t;}
})();

解决三:函数对象

函数也是一种对象 。利用这一个特性,我们也可以解决这个问题

function foo() {if (foo.t) return foo.t;foo.t = new Date();return foo.t;
}

解决四:惰性函数

不错,惰性函数就是解决每次都要进行判断的这个问题,解决原理很简单,重写函数

var foo = function() {var t = new Date();foo = function() {return t;};return foo();
};

更多应用

DOM事件添加中,为了兼容现代浏览器,和IE浏览器,我们需要对浏览器环境进行一次判断

// 简化写法
function addEvent (type, el, fn) {if (window.addEventListener) {el.addEventListener(type, fn, false);}else if(window.attachEvent){el.attachEvent('on' + type, fn);}
}

问题在于我们每当使用一次addEvent都会进行一次判断利用惰性函数,我们可以这样做

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);}}
})();

当我们每次需要进行条件判断,其实只需要判断一次,接下来的使用方式都不会发生改变的时候,想想是不是可以使用惰性函数。

var addEvent = (function(){if (window.addEventListener) {addEvent=function (type, el, fn) {el.addEventListener(type, fn, false);}el.addEventListener(type, fn, false);}else if(window.attachEvent){addEvent=function (type, el, fn) {el.attachEvent('on' + type, fn);}el.attachEvent('on' + type, fn);}
})();

其实就是把addEvent函数的内容重写,之前是有判断,但第一次判断之后,就重新写了addEvent,他就紧紧剩下一个 el.attachEvent(‘on’ + type, fn)或(el.addEventListener(type, fn, false))这条语句

JavaScript 专题之惰性函数相关推荐

  1. JavaScript 专题之函数柯里化

    JavaScript 专题系列第十三篇,讲解函数柯里化以及如何实现一个 curry 函数 定义 维基百科中对柯里化 (Currying) 的定义为: In mathematics and comput ...

  2. JavaScript 惰性函数

    概念 惰性函数,表示函数执行的分支只会在函数第一次调用的时候执行.在一次调用过程中,该函数会被覆盖威另一个按照合适方式执行的函数.这样对原函数的调用就不会再经过执行的分支了. 简单的来说,就是可以记录 ...

  3. JavaScript专题之从零实现jQuery的extend

    JavaScritp 专题系列第七篇,讲解如何从零实现一个 jQuery 的 extend 函数 前言 jQuery 的 extend 是 jQuery 中应用非常多的一个函数,今天我们一边看 jQu ...

  4. JavaScript 专题之如何判断两个对象相等

    JavaScript 专题系列第十二篇,讲解如何判断两个参数是否相等 前言 虽然标题写的是如何判断两个对象相等,但本篇我们不仅仅判断两个对象相等,实际上,我们要做到的是如何判断两个参数相等,而这必然会 ...

  5. export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...

    高阶函数的定义 在<javascript设计模式和开发实践>中是这样定义的. 函数可以作为参数被传递: 函数可以作为返回值输出. 结合这两个特点,首先想到的肯定是回调函数,回调函数也是高阶 ...

  6. web前端html怎么求最大值和最小值,第8篇-JavaScript专题之如何求数组的最大值和最小值...

    前言 取出数组中的最大值或者最小值是开发中常见的需求,但你能想出几种方法来实现这个需求呢? Math.max JavaScript 提供了 Math.max 函数返回一组数中的最大值,用法是: 值得注 ...

  7. JavaScript 专题(九)数组中查找指定元素

    JavaScript 专题(九)数组中查找指定元素 上一篇文章中,我们了解了数组扁平化的思想,并学习了 lodash 是如何处理数组扁平化的. 这次我们来讨论在数组中查找元素时所用的一些方法,并且参考 ...

  8. JavaScript专题(二):深入理解iframe

    原文地址为: JavaScript专题(二):深入理解iframe 一 目的 iframe是网页布局中重要的元素,是解决一些常见前端问题的必修课,而iframe总是让人捉摸不透,不好掌握.关于ifra ...

  9. JavaScript专题(七)类型转换

    JavaScript专题之最让人头疼的类型转换 目录 前言 一.类型转换是什么? 二.原始值转换的基本规则 三.对象转字符串和数字 四.常见的类型转换运算符 五.常见的类型转换操作 写在最后 前言 在 ...

最新文章

  1. Spring基础专题——第二章(注入Injection)
  2. MEET大会报名开启 | 李开复张亚勤等产学研大咖邀你共同见证智能未来
  3. 文巾解题 面试题 01.01. 判定字符是否唯一
  4. tensorflow教程 开始——数据集:快速了解 tf.data
  5. Ubuntu16.04安装nginx
  6. tuxedo错误码6_TUXEDE返回的所有错误代码
  7. python多线程下载_python3 多线程下载
  8. linux有名管道 复用,关于LINUX有名管道的多路复用有关问题
  9. .net HTML编码解析
  10. python爬小说收费章节_python 多线程爬小说返回章节乱套。求解
  11. ZR提高失恋测2(9.7)
  12. 计算机键盘上删除,电脑哪个是删除键
  13. ARX中各种坐标系及Transfrom操作相关
  14. Javascript实现简单的超级马里奥小游戏
  15. 2019ICPC徐州打铁心得
  16. MoviePy合成视频没有声音
  17. 拓宽你的认知,优秀的人都掌握的40个经典思维模型「附全部模型PPT」
  18. react-router4.2使用js控制路由跳转的3种方式
  19. 电脑怎么录制屏幕视频,3种方法,轻松弄懂
  20. 春分。谓之分。秋同义。

热门文章

  1. coding码市的运用
  2. 魔百盒CM201-2_朝歌ZG_主板版号M8291_强刷固件包
  3. 数论12——浅谈指数与对数
  4. ArcGIS API for JS4.8二维地图状态控制
  5. 声纹识别开源工具 ASV-Subtools
  6. BUAA-2021春-数据结构-综合作业-文本摘要生成(Hash实现 + SIMD优化 终测最速)
  7. android课程设计健身,健身软件课程设计_毕业论文设计.doc
  8. 计算机可靠度计算公式,可靠性计算公式大全
  9. Vue3 组件示例工程(二) —— AQI组件
  10. 2021-05-27let的TDZ