最近在读《JavaScript 设计模式》一书,其中工厂模式中提到了memoizing技术,今天仔细整理了一下memoization 相关的资料,与大家共享。
memoization 一词是Donald Michie 根据拉丁语memorandum杜撰的一个词。相应的动词、过去分词、ing形式有memoiz、memoized、memoizing.
Memoization 是一种将函数返回值缓存起来的方法,Memoization 原理非常简单,就是把函数的每次执行结果都放入一个键值对(数组也可以,视情况而定)中,在接下来的执行中,在键值对中查找是否已经有相应执行过的值,如果有,直接返回该值,没有才 真正执行函数体的求值部分。很明显,找值,尤其是在键值对中找值,比执行函数快多了。现代 JavaScript 的开发也已经大量使用这种技术。
我们知道,在不同的浏览器中,xmlHttpRequest对象的具体实现都不同。需要判断何种浏览器以执行具体的方法。这里就有一个使用memoization来实现的例子。
- function createXHRObject = function(){
- //先把三个匿名函数缓存起来。
- var methods = [
- function(){return new XMLHttpRequest();},
- function(){return new ActiveXObject("Msxml2.XMLHTTP");},
- function(){return new ActiveXObject("Microsoft.XMLHTTP");}
- ];
- for(var i=0,len=methods.length;i<len;i++){
- try{//这里用try catch来代替了条件判断,通常我不赞成这种写法
- methods[i]();
- }
- catch(e){
- continue;//如果报异常,则执行下一次循环
- }
- // 把createXHRObject 与能正常执行的匿名函数对应起来,再调用createXHRObject不用再检测浏览器了
- createXHRObject = method[i];
- return method[i];
- }
- }
以上是一个简单的例子,第一次执行createXHRObject()的时候,会循环判断methods 中的方法,获取一个能正确执行的,并将createXHRObject的引用指向这个方法。以后再使用这个方法的时候,不用去判断,直接自动获取正确的方法。这省去了频繁的ajax调用中浏览器的检测。
当然,这个方法看上去效率的提升不是特别明显,我之所以写上来,是因为能比较清晰的理解memoization是如何实现的。在递归调用的时候,memoization的威力才能更好的显现。
一个递归的例子:
-
function fib(n) {
-
if (n < 2) {
-
return n;
- }
-
return fib(n - 1) + fib(n - 2);
- }
这是一个经典的斐波纳契序列,fib(20) 会把fib这个方法执行21891次,如果是fib(40),这会执行331160281次。
再看看如何使用memoization来实现,由于fib的参数就是一个自然数,这里用一个数组来缓存fib函数执行的结果。数组的下标用来标识参数,该小标对应的值用来表示函数执行的结果。
- var iterMemoFib = (function() {
- var cache = [1, 1];
- var fib = function(n) {
- if (n >= cache.length) {
- //将一个递归转换成了一个遍历
- for (var i = cache.length; i <= n; i++) {
- cache[i] = cache[i - 2] + cache[i - 1];
- }
- }
- return cache[n-1];
- }
- return fib;
- })();
将Function的原型扩展memoize 和unmemoize 方法,这样你可以对任何函数实现memoize和解除memoize,当然,这个方法要慎重,对一些不是频繁执行的函数,没必要缓存:
- Function.prototype.memoize = function() {
- var pad = {};
- var self = this;
- var obj = arguments.length > 0 ? arguments[i] : null;
-
- var memoizedFn = function() {
- // 把参数作为数组保存,作为键,把函数执行的结果作为值缓存起来
- var args = [];
- for (var i = 0; i < arguments.length; i++) {
- args[i] = arguments[i];
- }
- if (!(args in pad)) {
- pad[args] = self.apply(obj, arguments);
- }
- return pad[args];
- }
- memoizedFn.unmemoize = function() {
- return self;
- }
- return memoizedFn;
- }
- Function.prototype.unmemoize = function() {
- alert("Attempt to unmemoize an unmemoized function.");
- return null;
- }
-
使用方法:
fib.memoize();
参考文档:
- Memoizing functions in JavaScript
- JavaScript Memoization
- 提升JS性能:将递归转换为迭代
- MemoizationFrom Wikipedia, the free encyclopedia
Copyright playgoogle.com© 2008
继续阅读《javascript中的memoization(memoizing) 技术介绍》的全文内容...
相关文章:
最新评论:


分享到:
相关推荐
《JavaScript核心技术》是一本真正意义上的“新书”,不仅介绍了最新的JavaScript知识和方向,还完全覆盖了当今Web开发中关于JavaScript的所有重要话题,它使用了大量实例代码,图文并茂地讲解了使用JavaScript的...
本文件主要介绍了JavaScript的一些新技术特性,包括其历史演变、规范制定以及相关组织的贡献。 在早期,JavaScript(ES3)的时代大约是从1995年至2000年,那时它主要用于简单的网页交互,如表单验证和动态效果。...
ajax学习 必备 ajas技术介绍 和基础的JavaScript学习 里面有2份文档,一份是对ajas技术的介绍 还有一份是 JavaScript(学习ajax必备的知识)的教材 对ajax初学者很有用
这个"JavaScript中文手册(完整版)"不仅适合初学者入门,也对有经验的开发者提供了一个便捷的参考资源,通过它,你可以快速查找和理解各种JavaScript概念和技术,提高开发效率。无论你是准备学习JavaScript,还是在...
第2部分介绍JavaScript的发展和技术背景;第3部分深入探索JavaScript,介绍了语法、值、运算符、布尔类型、数字、字符串、语句、异常捕获、函数、变量、对象与继承、数组、正则表达式、Date、Math、JSON、标准全局...
中文帮助文档是开发者在使用ArcGIS API for JavaScript时的重要参考资料,它详细地解释了各种函数、类、方法和属性,以及如何将它们应用于实际项目中。文档通常会按照功能模块划分,如地图操作、图层管理、服务调用...
学习 Web 技术:HTML,CSS,JavaScript学习 Web 技术:HTML,CSS,JavaScript 学习 Web 技术:HTML,CSS,JavaScript学习 Web 技术:HTML,CSS,JavaScript 学习 Web 技术:HTML,CSS,JavaScript学习 Web 技术:...
错误处理机制章节介绍了JavaScript中的Error对象、throw语句、try...catch结构和finally代码块。良好的错误处理机制能够帮助开发者编写更加健壮的代码。 最后,编程风格章节强调了JavaScript编程中的风格问题,包括...
标题“javascript调用delphi中的函数”涉及到的技术领域是跨语言通信,具体是JavaScript与Delphi之间的交互。这种交互通常发生在Web应用程序与桌面应用程序的集成,或者在浏览器扩展和本地资源之间。以下是对这一...
《JavaScript中文参考手册》是一本详尽介绍JavaScript语言的电子书,它为学习和理解JavaScript提供了丰富的资源。这本书涵盖了JavaScript的基本语法、数据类型、控制结构、函数、对象、DOM操作、AJAX异步通信以及...
本文介绍了 JavaScript 在 ASP 技术中的应用,讨论了 JavaScript 和 ASP 相结合的优点,并详细阐述了在 ASP 中加入 JavaScript 的方法。 JavaScript 是一种基于对象和事件驱动的脚本语言,可以使得信息和用户之间...
运用书中讲述的技巧和技术,可以使JavaScript团队编程从侠义的个人偏好的阴霾走出来,走向真正的高可维护性、高效能和高水准。 Nicholas C. Zakas是一名前端开发顾问、作者、演讲家。他在Yahoo! 供职超过5年时间。...
在JavaScript权威指南第六版中,作者首先介绍了JavaScript的基本概念,包括词法结构、类型、值、变量、表达式、运算符以及语句等基础知识。接着,书中深入讨论了对象、数组、函数等JavaScript中的核心概念。特别地,...
《众妙之门——JavaScript与jQuery技术精粹》出自世界知名Web设计网站Smashing Magazine,其中的文章是来自全球顶级设计师的精华总结。全书共分为两大部分,第一部分阐述JavaScript的实战经验,共7章,内容涉及...
本书由Douglas Crockford所著,他不仅是JSON格式的创始人,也是JavaScript社区中备受尊敬的专家。在书中,Crockford将自己多年的实践经验与对JavaScript深刻理解相结合,为读者呈现了一个清晰、严谨且实用的...
最后,“JavaScript对象与数组参考大全 .chm”专门关注JavaScript中的对象和数组,这是JavaScript编程中非常关键的部分。JavaScript是一种基于对象的语言,其核心就是对象和原型链。这个文档可能会详细讲解对象的...
另外,随着前端框架的兴起,书中可能也对jQuery等库的使用进行了介绍,这些工具大大简化了JavaScript开发,提高了开发效率。 除此之外,《JavaScript开发技术大全》可能还包含了JavaScript的事件处理、特效制作、...
本书“JavaScript实战.pdf 中文完整版”深入浅出地介绍了JavaScript在实际项目中的应用,旨在帮助读者提升实战能力,掌握从基础到高级的JavaScript知识。 一、JavaScript基础 1. 变量与数据类型:了解JavaScript中...
在书中,作者详细介绍了JavaScript的基础语法,如变量、数据类型、运算符、流程控制语句,这些是编写任何程序的基础。此外,书中还深入讲解了函数、作用域、闭包等关键概念,这些都是JavaScript独特特性和强大功能的...
JavaScript DOM编程艺术(第2版)是一本深受程序员喜爱的JavaScript技术书籍,专注于讲解如何使用JavaScript与Document Object Model(DOM)进行交互。DOM是Web页面的结构化表示,它允许我们通过编程方式操纵HTML和XML...