JavaScript 专题之惰性函数
需求
我们现在需要写一个 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 专题之惰性函数相关推荐
- JavaScript 专题之函数柯里化
JavaScript 专题系列第十三篇,讲解函数柯里化以及如何实现一个 curry 函数 定义 维基百科中对柯里化 (Currying) 的定义为: In mathematics and comput ...
- JavaScript 惰性函数
概念 惰性函数,表示函数执行的分支只会在函数第一次调用的时候执行.在一次调用过程中,该函数会被覆盖威另一个按照合适方式执行的函数.这样对原函数的调用就不会再经过执行的分支了. 简单的来说,就是可以记录 ...
- JavaScript专题之从零实现jQuery的extend
JavaScritp 专题系列第七篇,讲解如何从零实现一个 jQuery 的 extend 函数 前言 jQuery 的 extend 是 jQuery 中应用非常多的一个函数,今天我们一边看 jQu ...
- JavaScript 专题之如何判断两个对象相等
JavaScript 专题系列第十二篇,讲解如何判断两个参数是否相等 前言 虽然标题写的是如何判断两个对象相等,但本篇我们不仅仅判断两个对象相等,实际上,我们要做到的是如何判断两个参数相等,而这必然会 ...
- export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...
高阶函数的定义 在<javascript设计模式和开发实践>中是这样定义的. 函数可以作为参数被传递: 函数可以作为返回值输出. 结合这两个特点,首先想到的肯定是回调函数,回调函数也是高阶 ...
- web前端html怎么求最大值和最小值,第8篇-JavaScript专题之如何求数组的最大值和最小值...
前言 取出数组中的最大值或者最小值是开发中常见的需求,但你能想出几种方法来实现这个需求呢? Math.max JavaScript 提供了 Math.max 函数返回一组数中的最大值,用法是: 值得注 ...
- JavaScript 专题(九)数组中查找指定元素
JavaScript 专题(九)数组中查找指定元素 上一篇文章中,我们了解了数组扁平化的思想,并学习了 lodash 是如何处理数组扁平化的. 这次我们来讨论在数组中查找元素时所用的一些方法,并且参考 ...
- JavaScript专题(二):深入理解iframe
原文地址为: JavaScript专题(二):深入理解iframe 一 目的 iframe是网页布局中重要的元素,是解决一些常见前端问题的必修课,而iframe总是让人捉摸不透,不好掌握.关于ifra ...
- JavaScript专题(七)类型转换
JavaScript专题之最让人头疼的类型转换 目录 前言 一.类型转换是什么? 二.原始值转换的基本规则 三.对象转字符串和数字 四.常见的类型转换运算符 五.常见的类型转换操作 写在最后 前言 在 ...
最新文章
- Spring基础专题——第二章(注入Injection)
- MEET大会报名开启 | 李开复张亚勤等产学研大咖邀你共同见证智能未来
- 文巾解题 面试题 01.01. 判定字符是否唯一
- tensorflow教程 开始——数据集:快速了解 tf.data
- Ubuntu16.04安装nginx
- tuxedo错误码6_TUXEDE返回的所有错误代码
- python多线程下载_python3 多线程下载
- linux有名管道 复用,关于LINUX有名管道的多路复用有关问题
- .net HTML编码解析
- python爬小说收费章节_python 多线程爬小说返回章节乱套。求解
- ZR提高失恋测2(9.7)
- 计算机键盘上删除,电脑哪个是删除键
- ARX中各种坐标系及Transfrom操作相关
- Javascript实现简单的超级马里奥小游戏
- 2019ICPC徐州打铁心得
- MoviePy合成视频没有声音
- 拓宽你的认知,优秀的人都掌握的40个经典思维模型「附全部模型PPT」
- react-router4.2使用js控制路由跳转的3种方式
- 电脑怎么录制屏幕视频,3种方法,轻松弄懂
- 春分。谓之分。秋同义。
热门文章
- coding码市的运用
- 魔百盒CM201-2_朝歌ZG_主板版号M8291_强刷固件包
- 数论12——浅谈指数与对数
- ArcGIS API for JS4.8二维地图状态控制
- 声纹识别开源工具 ASV-Subtools
- BUAA-2021春-数据结构-综合作业-文本摘要生成(Hash实现 + SIMD优化 终测最速)
- android课程设计健身,健身软件课程设计_毕业论文设计.doc
- 计算机可靠度计算公式,可靠性计算公式大全
- Vue3 组件示例工程(二) —— AQI组件
- 2021-05-27let的TDZ