Memoization,简单的说就是优化计算机的性能,缓存那些重复性的函数操作和计算,使得第一次之后的调用可以直接从缓存中得到结果,而无需重新计算和运行复杂、费时的函数。这个跟Lazy Definition的原理是比较相似的,Lazy Definition主要是对函数进行重复定义,避免浏览器检测等恶心的事情。在javascript里实现Memoization的技术,Keith Gaughan做了相关的叙述:Memoization in JavaScript。特别是它对Fibonacci的优化让我特别的玩味。 对于Fibonacci普通的实现方式是: [javascript] //这个性能不咋的,函数调用太频繁了 function Fib(n) { if (n < 2) { return n;} return … 了解更多
之前一直在想法设法的实现js脚本文件按顺序执行,而且并行下载的测试,但是都无终而返。最先设想的是通过轮询的方式来实现按顺序加载,可是这样就导致不能并行加载了。 今天又拾起这个一直未实现的冲动,首先既然要并行加载、按顺序执行,那么就必须得给每一个js文件开一个http请求,而且这个请求是无顺序的,即是加载的顺序是无顺序的,但是在执行的时候,就得要按照声明的顺序来执行,比如下面的代码示例: [javascript] jL.load({"label":"test","url":"test.js",isOrder:true}); jL.load({"label":"test2","url":"test2.js",isOrder:false}); jL.load({"label":"test3","url":"test3.js",isOrder:true,callback:function(){ alert("test3.js is load"); }}).insert(); [/javascript] 上面的代码中,load方法的参数中包含是否按顺序加载脚本文件,并且在脚本加载下来的时候包含callback函数回调。如果不是按顺序下载的,则直接使用DOM Element的方式插入script到document.body中;insert方法负责开始操作那些俺顺序执行的脚本文件的加载和插入工作;label参数对于需要按顺序执行的脚本文件必不可少,用于标识当前脚本,对无需按顺序执行的脚本可有可无。
大家应该都知道Javascript中分支技术的实现原理:是一种用来把浏览器间的差异封装到在运行期间进行设置的动态方法中的技术。没错,这个解释是出自《Javascript设计模式》。分支技术最大的特点是只在脚本加载是一次性的确定针对特定的浏览器的代码,这样一来,在初始化完成之后,每种浏览器都只会执行针对特定浏览器的代码,能够在运行时动态确定函数代码的能力。下面是分支技术的简单实现的一个例子: [javascript] //三个对象都声明相同的createXhr方法以示统一 var SimpleXhrFactory=(function(){ var standard={ createXhr:function(){ return new XMLHttpRequest(); } }; var activeXNew={ createXhr:function(){ return new ActiveXObject("Msxml2.XMLHTTP"); } … 了解更多
Lazy Definition Pattern是这样的一个模式:根据浏览器之间的解析javascript的差异性,使得创建封装的对象或者是函数的时候都需要使用浏览器的嗅探技术来做判断,而且对象或者方法每调用一次就需要去嗅探,这是一个非常不好的额外功。而解决这个瓶颈的方法之一就是Lazy Definition了。它会在浏览器第一次执行该对象或者函数的时候就记住这次的操作,以至于下面的重复调用不会再去执行浏览器的嗅探。让我们先从一个简单的addListener封装函数来一步步分析。 我们通常封装浏览器的添加事件函数的方式是使用下面的方式: [javascript] var addListener=function(el, type, handle) { if (el.addEventListener) { el.addEventListener(type, handle, false); }else if (el.attachEvent) … 了解更多