惰性函数定义模式
作者:Realazy 来源:Realazy 发布时间:2007-09-26 20:56:00
这篇文章阐述的是一种函数式编程(functional-programming)设计模式,我称之为惰性函数定义(Lazy Function Definition)。我不止一次发现这种模式在JavaScript中大有用处,尤其是编写跨浏览器的、高效运行的库之时。
热身问题
编写一个函数foo,它返回的是Date对象,这个对象保存的是foo首次调用的时间。
方法一:上古时代的技术
这个最简陋的解决方案使用了全局变量t来保存Date对象。foo首次调用时会把时间保存到t中。接下来的再次调用,foo只会返回保存在t中的值。
var t;
function foo() {
if (t) {
return t;
}
t = new Date();
return t;
}
但是这样的代码有两个问题。第一,变量t是一个多余的全局变量,并且在 foo调用的间隔期间有可能被更改。第二,在调用时这些代码的效率并没有得到优化因为每次调用 foo都必须去求值条件。虽然在这个例子中,求值条件并不显得低效,但在现实世界的实践例子中常常会有极为昂贵的条件求值,比如在if-else-else-…的结构中。
方法二:模块模式
我们可以通过被认为归功于Cornford 和 Crockford 的模块模式来弥补第一种方法的缺陷。使用闭包可以隐藏全局变量t,只有在 foo内的代码才可以访问它。
var foo = (function() {
var t;
return function() {
if (t) {
return t;
}
t = new Date();
return t;
}
})();
但这仍然没有优化调用时的效率,因为每次调用foo依然需要求值条件。
虽然模块模式是一个强大的工具,但我坚信在这种情形下它用错了地方。
方法三:函数作为对象
由于JavaScript的函数也是对象,所以它可以带有属性,我们可以据此实现一种跟模块模式质量差不多的解决方案。
function foo() {
if (foo.t) {
return foo.t;
}
foo.t = new Date();
return foo.t;
}
在一些情形中,带有属性的函数对象可以产生比较清晰的解决方案。我认为,这个方法在理念上要比模式模块方法更为简单。
这个解决方案避免了第一种方法中的全局变量t,但仍然解决不了foo每次调用所带来的条件求值。


猜你喜欢
- 按行读取TXT文件 fname = './新建文件夹/yob2010.txt' //文件夹路径with open
- 前言:在网络时代,图片已经成为了我们生活中不可或缺的一部分。随着各种社交媒体的兴起,我们可以在网上看到越来越多的图片,但是如何从这些图片中获
- 页面访问慢是网站公认的死穴,如果页面都没法访问,往后再精彩的体验都等于零。这个问题如果专业点说,叫做“加载”呈现效率。那么具体了讲,除常规的
- Linux添加mysql系统环境变量昨天安装完mysql后,直接在export PATH上面一行,增加了export PATH=/usr/l
- 这是一个非常简单的解决方案,柱状图中每一条柱都是一个 div,数据的大小呈现在 div 的宽或高上。 查看演示 例子下载实现的原理
- 下文要实现的可视化大屏内容:需要在地图上将我司船舶的轨迹展示出来。听起来很简单,一开始我也是这样想的。通过一些BI工具应该可以轻松实现,比如
- BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中。 语法:BULK INSERT [ [ 'database
- string是c#中的类 String是.net Framework的类 用string需要通过再次编译,所以直接用String速度会更快·
- 在 Django 网站中使用 mailgun 的邮件收发服务。1.在 mailgun 官网上注册个账号(免费,免费账号每个月有10000条收
- 本文实例讲述了php基于curl实现随机ip地址抓取内容的方法。分享给大家供大家参考,具体如下:使用php curl 我们可以模仿用户行为,
- MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Redu
- 在javascript开发过程中,如果总是使用alert的方式调试程序,在某些简单的程序中是可行的. 但是在通常的项目很复杂,这
- Flask是一个用Python编写的Web应用程序框架,Flask是python的web框架,最大的特征是轻便,让开发者自由灵活的兼容要开发
- 本文实例讲述了python实现的多任务版udp聊天器。分享给大家供大家参考,具体如下:说明编写一个有2个线程的程序线程1用来接收数据然后显示
- 问题背景a=[1,4,2,1,5,6,9,0]#删除列表中的元素,其所在的位置为[1,3,7]del_index=[1,3,7]tmp=[i
- 众所周知tensorflow造势虽大却很难用,因此推荐使用Keras,它缺省是基于tensorflow的,但通过修改keras.json也可
- 本文实例讲述了js模仿php中strtotime()与date()函数实现方法。分享给大家供大家参考。具体如下:在js中没有像php中str
- 一 概念固定窗口就像是滑动窗口的一个特例,固定窗口是大小固定且不能随着时间而变化的。滑动时间窗口就是把一段时间片分为多个样本窗口,可以通过更
- list.asp<%@LANGUAGE="VBSCRIPT" CODEPAGE="936&qu
- 导言:到目前为止,我们的教程围绕的是text数据。然而,很多应用程序既需要处理text数据,也需要处理二进制数据。比如招聘网站可能需要用户上