最近在读《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) 技术介绍》的全文内容...
相关文章:
最新评论:
分享到:
相关推荐
CSS技术和JavaScript技术CSS技术和JavaScript技术
JavaScript简介及基础语法介绍,为初学者简单介绍JavaScript,提供入门级教学
ajax学习 必备 ajas技术介绍 和基础的JavaScript学习 里面有2份文档,一份是对ajas技术的介绍 还有一份是 JavaScript(学习ajax必备的知识)的教材 对ajax初学者很有用
JavaScript技术练习小项目 该项目包含JavaScript的多项技术点,可以有效练习我们的能力,提高对js的认识 JavaScript技术练习小项目 该项目包含JavaScript的多项技术点,可以有效练习我们的能力,提高对js的认识 ...
《JavaScript核心技术》是一本真正意义上的“新书”,不仅介绍了最新的JavaScript知识和方向,还完全覆盖了当今Web开发中关于JavaScript的所有重要话题,它使用了大量实例代码,图文并茂地讲解了使用JavaScript的...
《众妙之门——JavaScript与jQuery技术精粹》出自世界知名Web设计网站Smashing Magazine,其中的文章是来自全球顶级设计师的精华总结。全书共分为两大部分,第一部分阐述JavaScript的实战经验,共7章,内容涉及...
javascript开发技术大全
JavaScript技术讲解,ppt文档,javaScript技术电子文档,叫你如何学习掌握JavaScript技术,
JavaScript开发技术大全JavaScript开发技术大全JavaScript开发技术大全JavaScript开发技术大全
第2部分介绍JavaScript的发展和技术背景;第3部分深入探索JavaScript,介绍了语法、值、运算符、布尔类型、数字、字符串、语句、异常捕获、函数、变量、对象与继承、数组、正则表达式、Date、Math、JSON、标准全局...
JavaScript的新技术特性介绍.pptx
学习 Web 技术:HTML,CSS,JavaScript学习 Web 技术:HTML,CSS,JavaScript 学习 Web 技术:HTML,CSS,JavaScript学习 Web 技术:HTML,CSS,JavaScript 学习 Web 技术:HTML,CSS,JavaScript学习 Web 技术:...
第5章 JavaScript编程技术 5.1 JavaScript编程基础 5.1.1 JavaScript简介 5.1.2 Javascript的使用方法 5.1.3 语法规则 5.1.4 运算符和表达式 5.1.5 函数 5.1.6流程控制 5.1.7 事件处理 5.2 JavaScript对象编程 5.2.1...
JavaScript脚本技术JavaScript脚本技术
JavaScript开发技术大全.rar JavaScript开发技术大全.rar JavaScript开发技术大全.rar JavaScript开发技术大全.rar
JavaScript中的数组特性介绍.docx
JavaScript中的数学运算介绍.docx
在《JavaScript入门经典(第3版)》的高级主题中,将介绍如何使用cookie,以及如何应用DHTML技术使Web页面焕发动感和活力。另外,《JavaScript入门经典(第3版)》还介绍了Ajax 技术。Ajax技术允许在客户端代码中使用...
[Manning Publications] JavaScript 核心技术揭秘 (英文版) [Manning Publications] Secrets of the JavaScript Ninja (E-Book) ☆ 出版信息:☆ [作者信息] John Resig, Bear Bibeault [出版机构] Manning ...
《高性能JavaScript》揭示的技术和策略能帮助你在开发过程中消除性能瓶颈。你将会了解如何提升各方面的性能,包括代码的加载、运行、DOM交互、页面生存周期等。雅虎的前端工程师Nicholas C. Zakas和其他五位...