全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript学习笔记之惰性函数示例详解

前言

本文主要给大家介绍了关于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);
 }
 }
})();

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

重要参考

Lazy Function Definition Pattern

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# javascript  # 惰性函数  # js  # 惰性求值  # JavaScript惰性求值的一种实现方法示例  # JS设计模式之惰性模式(二)  # JS 学习总结之正则表达式的懒惰性和贪婪性  # JS优化与惰性载入函数实例分析  # js正则表达式惰性匹配和贪婪匹配用法分析  # JavaScript AJAX之惰性载入函数  # 利用函数的惰性载入提高javascript代码执行效率  # JavaScript 函数惰性载入的实现及其优点介绍  # 如何用JavaScript实现一个数组惰性求值库  # 首次  # 全局变量  # 都必须  # 相关内容  # 都要  # 说了  # 一是  # 不多  # 这个问题  # 很容易  # 我们可以  # 这样做  # 给大家  # 很简单  # 重写  # 只需要  # 可以使用  # 我们现在  # 当我们  # 这篇文章 


相关文章: 如何快速登录WAP自助建站平台?  网站制作公司排行榜,抖音怎样做个人官方网站  如何配置IIS站点权限与局域网访问?  如何用IIS7快速搭建并优化网站站点?  网站制作新手教程,新手建设一个网站需要注意些什么?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  如何在Golang中使用replace替换模块_指定本地或远程路径  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  建站之星免费版是否永久可用?  制作门户网站的参考文献在哪,小说网站怎么建立?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  建站主机如何选?高性价比方案全解析  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  深圳网站制作平台,深圳市做网站好的公司有哪些?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何快速搭建虚拟主机网站?新手必看指南  javascript中的try catch异常捕获机制用法分析  网站制作说明怎么写,简述网页设计的流程并说明原因?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  广州营销型建站服务商推荐:技术优势与SEO优化解析  制作网站公司那家好,网络公司是做什么的?  如何选择PHP开源工具快速搭建网站?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何用搬瓦工VPS快速搭建个人网站?  如何快速上传建站程序避免常见错误?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  教学网站制作软件,学习*后期制作的网站有哪些?  如何快速搭建FTP站点实现文件共享?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  成都响应式网站开发,dw怎么把手机适应页面变成网页?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  网站制作服务平台,有什么网站可以发布本地服务信息?  建站主机选购指南:核心配置优化与品牌推荐方案  建站之星×万网:智能建站系统+自助建站平台一键生成  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  企业微网站怎么做,公司网站和公众号有什么区别?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  网站制作网站,深圳做网站哪家比较好?  如何规划企业建站流程的关键步骤?  c# 在高并发场景下,委托和接口调用的性能对比  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  Python文件管理规范_工程实践说明【指导】  如何通过PHP快速构建高效问答网站功能?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。