`
karrykai
  • 浏览: 9862 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

javascript中的memoization(memoizing) 技术介绍

阅读更多

最近在读《JavaScript 设计模式》一书,其中工厂模式中提到了memoizing技术,今天仔细整理了一下memoization 相关的资料,与大家共享。

memoization 一词是Donald Michie 根据拉丁语memorandum杜撰的一个词。相应的动词、过去分词、ing形式有memoiz、memoized、memoizing.

Memoization 是一种将函数返回值缓存起来的方法,Memoization 原理非常简单,就是把函数的每次执行结果都放入一个键值对(数组也可以,视情况而定)中,在接下来的执行中,在键值对中查找是否已经有相应执行过的值,如果有,直接返回该值,没有才 真正执行函数体的求值部分。很明显,找值,尤其是在键值对中找值,比执行函数快多了。现代 JavaScript 的开发也已经大量使用这种技术。

  •  一个简单的使用memoization的例子

我们知道,在不同的浏览器中,xmlHttpRequest对象的具体实现都不同。需要判断何种浏览器以执行具体的方法。这里就有一个使用memoization来实现的例子。

  1. function createXHRObject = function(){
  2.     //先把三个匿名函数缓存起来。
  3.     var methods = [
  4.         function(){return new XMLHttpRequest();},
  5.         function(){return new ActiveXObject("Msxml2.XMLHTTP");},
  6.         function(){return new ActiveXObject("Microsoft.XMLHTTP");}
  7.     ];
  8.     for(var i=0,len=methods.length;i<len;i++){
  9.         try{//这里用try catch来代替了条件判断,通常我不赞成这种写法
  10.             methods[i]();
  11.         }
  12.         catch(e){
  13.             continue;//如果报异常,则执行下一次循环
  14.         }
  15.         // 把createXHRObject 与能正常执行的匿名函数对应起来,再调用createXHRObject不用再检测浏览器了
  16.         createXHRObject = method[i];
  17.         return method[i];
  18.     }
  19. }

以上是一个简单的例子,第一次执行createXHRObject()的时候,会循环判断methods 中的方法,获取一个能正确执行的,并将createXHRObject的引用指向这个方法。以后再使用这个方法的时候,不用去判断,直接自动获取正确的方法。这省去了频繁的ajax调用中浏览器的检测。

当然,这个方法看上去效率的提升不是特别明显,我之所以写上来,是因为能比较清晰的理解memoization是如何实现的。在递归调用的时候,memoization的威力才能更好的显现。

一个递归的例子

  1. function fib(n) {
  2. if (n < 2) {
  3. return n;
  4. }
  5. return fib(n - 1) + fib(n - 2);
  6. }

 这是一个经典的斐波纳契序列,fib(20) 会把fib这个方法执行21891次,如果是fib(40),这会执行331160281次。

再看看如何使用memoization来实现,由于fib的参数就是一个自然数,这里用一个数组来缓存fib函数执行的结果。数组的下标用来标识参数,该小标对应的值用来表示函数执行的结果。

  1.  var iterMemoFib = (function() {
  2.     var cache = [1, 1];
  3.     var fib = function(n) {
  4.         if (n >= cache.length) {
  5.             //将一个递归转换成了一个遍历
  6.             for (var i = cache.length; i <= n; i++) {
  7.                 cache[i] = cache[i - 2] + cache[i - 1];
  8.             }
  9.         }
  10.         return cache[n-1];
  11.     }
  12.     return fib;
  13. })();

将Function的原型扩展memoizeunmemoize 方法,这样你可以对任何函数实现memoize和解除memoize,当然,这个方法要慎重,对一些不是频繁执行的函数,没必要缓存:

  1. Function.prototype.memoize = function() {
  2.     var pad  = {};
  3.     var self = this;
  4.     var obj  = arguments.length > 0 ? arguments[i] : null;
  5.  
  6.     var memoizedFn = function() {
  7.         // 把参数作为数组保存,作为键,把函数执行的结果作为值缓存起来
  8.         var args = [];
  9.         for (var i = 0; i < arguments.length; i++) {
  10.             args[i] = arguments[i];
  11.         }
  12.         if (!(args in pad)) {
  13.             pad[args] = self.apply(obj, arguments);
  14.         }
  15.         return pad[args];
  16.     }
  17.     memoizedFn.unmemoize = function() {
  18.         return self;
  19.     }
  20.     return memoizedFn;
  21. }
  22. Function.prototype.unmemoize = function() {
  23.     alert("Attempt to unmemoize an unmemoized function.");
  24.     return null;
  25. }
  26.  

使用方法:

fib.memoize();

参考文档:

  1. Memoizing functions in JavaScript
  2. JavaScript Memoization
  3. 提升JS性能:将递归转换为迭代
  4. MemoizationFrom Wikipedia, the free encyclopedia

Copyright playgoogle.com© 2008

继续阅读《javascript中的memoization(memoizing) 技术介绍》的全文内容...

相关文章:


最新评论:

分享到:
评论

相关推荐

    JavaScript核心技术 PDF扫描版

    《JavaScript核心技术》是一本真正意义上的“新书”,不仅介绍了最新的JavaScript知识和方向,还完全覆盖了当今Web开发中关于JavaScript的所有重要话题,它使用了大量实例代码,图文并茂地讲解了使用JavaScript的...

    JavaScript的新技术特性介绍.pptx

    本文件主要介绍了JavaScript的一些新技术特性,包括其历史演变、规范制定以及相关组织的贡献。 在早期,JavaScript(ES3)的时代大约是从1995年至2000年,那时它主要用于简单的网页交互,如表单验证和动态效果。...

    ajax学习 必备 ajas技术介绍 和基础的JavaScript学习

    ajax学习 必备 ajas技术介绍 和基础的JavaScript学习 里面有2份文档,一份是对ajas技术的介绍 还有一份是 JavaScript(学习ajax必备的知识)的教材 对ajax初学者很有用

    JavaScript中文手册(完整版).rar

    这个"JavaScript中文手册(完整版)"不仅适合初学者入门,也对有经验的开发者提供了一个便捷的参考资源,通过它,你可以快速查找和理解各种JavaScript概念和技术,提高开发效率。无论你是准备学习JavaScript,还是在...

    深入理解JavaScript系列

    第2部分介绍JavaScript的发展和技术背景;第3部分深入探索JavaScript,介绍了语法、值、运算符、布尔类型、数字、字符串、语句、异常捕获、函数、变量、对象与继承、数组、正则表达式、Date、Math、JSON、标准全局...

    arcgis api for javascript 中文帮助文档和demo

    中文帮助文档是开发者在使用ArcGIS API for JavaScript时的重要参考资料,它详细地解释了各种函数、类、方法和属性,以及如何将它们应用于实际项目中。文档通常会按照功能模块划分,如地图操作、图层管理、服务调用...

    学习 Web 技术:HTML,CSS,JavaScript .zip

    学习 Web 技术:HTML,CSS,JavaScript学习 Web 技术:HTML,CSS,JavaScript 学习 Web 技术:HTML,CSS,JavaScript学习 Web 技术:HTML,CSS,JavaScript 学习 Web 技术:HTML,CSS,JavaScript学习 Web 技术:...

    JavaScript标准参考教程

    错误处理机制章节介绍了JavaScript中的Error对象、throw语句、try...catch结构和finally代码块。良好的错误处理机制能够帮助开发者编写更加健壮的代码。 最后,编程风格章节强调了JavaScript编程中的风格问题,包括...

    javascript调用delphi中的函数

    标题“javascript调用delphi中的函数”涉及到的技术领域是跨语言通信,具体是JavaScript与Delphi之间的交互。这种交互通常发生在Web应用程序与桌面应用程序的集成,或者在浏览器扩展和本地资源之间。以下是对这一...

    javascript中文参考手册

    《JavaScript中文参考手册》是一本详尽介绍JavaScript语言的电子书,它为学习和理解JavaScript提供了丰富的资源。这本书涵盖了JavaScript的基本语法、数据类型、控制结构、函数、对象、DOM操作、AJAX异步通信以及...

    Javascript在ASP技术中的应用.pdf

    本文介绍了 JavaScript 在 ASP 技术中的应用,讨论了 JavaScript 和 ASP 相结合的优点,并详细阐述了在 ASP 中加入 JavaScript 的方法。 JavaScript 是一种基于对象和事件驱动的脚本语言,可以使得信息和用户之间...

    编写可维护的JavaScript中文完整版+英文版

    运用书中讲述的技巧和技术,可以使JavaScript团队编程从侠义的个人偏好的阴霾走出来,走向真正的高可维护性、高效能和高水准。 Nicholas C. Zakas是一名前端开发顾问、作者、演讲家。他在Yahoo! 供职超过5年时间。...

    JavaScript权威指南(第六版) 清晰-完整

    在JavaScript权威指南第六版中,作者首先介绍了JavaScript的基本概念,包括词法结构、类型、值、变量、表达式、运算符以及语句等基础知识。接着,书中深入讨论了对象、数组、函数等JavaScript中的核心概念。特别地,...

    众妙之门——JavaScript与jQuery技术精粹

    《众妙之门——JavaScript与jQuery技术精粹》出自世界知名Web设计网站Smashing Magazine,其中的文章是来自全球顶级设计师的精华总结。全书共分为两大部分,第一部分阐述JavaScript的实战经验,共7章,内容涉及...

    JavaScript语言精粹完整版

    本书由Douglas Crockford所著,他不仅是JSON格式的创始人,也是JavaScript社区中备受尊敬的专家。在书中,Crockford将自己多年的实践经验与对JavaScript深刻理解相结合,为读者呈现了一个清晰、严谨且实用的...

    JavaScript文档

    最后,“JavaScript对象与数组参考大全 .chm”专门关注JavaScript中的对象和数组,这是JavaScript编程中非常关键的部分。JavaScript是一种基于对象的语言,其核心就是对象和原型链。这个文档可能会详细讲解对象的...

    javascript开发技术大全

    另外,随着前端框架的兴起,书中可能也对jQuery等库的使用进行了介绍,这些工具大大简化了JavaScript开发,提高了开发效率。 除此之外,《JavaScript开发技术大全》可能还包含了JavaScript的事件处理、特效制作、...

    JavaScript实战.pdf 中文完整版

    本书“JavaScript实战.pdf 中文完整版”深入浅出地介绍了JavaScript在实际项目中的应用,旨在帮助读者提升实战能力,掌握从基础到高级的JavaScript知识。 一、JavaScript基础 1. 变量与数据类型:了解JavaScript中...

    Javascript 高级程序设计(第3版)超清中文PDF

    在书中,作者详细介绍了JavaScript的基础语法,如变量、数据类型、运算符、流程控制语句,这些是编写任何程序的基础。此外,书中还深入讲解了函数、作用域、闭包等关键概念,这些都是JavaScript独特特性和强大功能的...

    JavaScript DOM编程艺术(第2版pdf)+源代码

    JavaScript DOM编程艺术(第2版)是一本深受程序员喜爱的JavaScript技术书籍,专注于讲解如何使用JavaScript与Document Object Model(DOM)进行交互。DOM是Web页面的结构化表示,它允许我们通过编程方式操纵HTML和XML...

Global site tag (gtag.js) - Google Analytics