<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: JavaScript Memoization</title>
	<atom:link href="http://chen.xianan.name/blog/2008/04/22/javascript-memoization/feed/" rel="self" type="application/rss+xml" />
	<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/</link>
	<description>web 标准，前端开发，编程感悟，生活杂想</description>
	<lastBuildDate>Mon, 22 Feb 2010 09:15:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: 網站製作學習誌 &#187; [Web] 連結分享</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-158856</link>
		<dc:creator>網站製作學習誌 &#187; [Web] 連結分享</dc:creator>
		<pubDate>Wed, 25 Nov 2009 02:38:31 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-158856</guid>
		<description>[...] JavaScript Memoization [...]</description>
		<content:encoded><![CDATA[<p>[...] JavaScript Memoization [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Hades</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-151593</link>
		<dc:creator>Hades</dc:creator>
		<pubDate>Wed, 10 Jun 2009 15:02:43 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-151593</guid>
		<description>在Ajaxian.com上看到的一个:

http://ajaxian.com/index.php?s=Memoization+&amp;searchbutton=go
 

// memoize: a general-purpose function to enable a function to use memoization
//   func: the function to be memoized
//   context: the context for the memoized function to execute within
//   Note: the function must use explicit, string-serializable parameters
function memoize (func, context) {
    function memoizeArg (argPos) {
        var cache = {};
        return function () {
            if (argPos == 0) {
                if (!(arguments[argPos] in cache)) {
                    cache[arguments[argPos]] = func.apply(context, arguments);
                }
                return cache[arguments[argPos]];
            }
            else {
                if (!(arguments[argPos] in cache)) {
                    cache[arguments[argPos]] = memoizeArg(argPos - 1);
                }
                return cache[arguments[argPos]].apply(this, arguments);
            }
        }
    }
    // JScript doesn&#039;t grok the arity property, but uses length instead
    var arity = func.arity &#124;&#124; func.length; 
    return memoizeArg(arity - 1);
}</description>
		<content:encoded><![CDATA[<p>在Ajaxian.com上看到的一个:</p>
<p><a href="http://ajaxian.com/index.php?s=Memoization+&amp;searchbutton=go" rel="nofollow">http://ajaxian.com/index.php?s=Memoization+&amp;searchbutton=go</a></p>
<p>// memoize: a general-purpose function to enable a function to use memoization<br />
//   func: the function to be memoized<br />
//   context: the context for the memoized function to execute within<br />
//   Note: the function must use explicit, string-serializable parameters<br />
function memoize (func, context) {<br />
    function memoizeArg (argPos) {<br />
        var cache = {};<br />
        return function () {<br />
            if (argPos == 0) {<br />
                if (!(arguments[argPos] in cache)) {<br />
                    cache[arguments[argPos]] = func.apply(context, arguments);<br />
                }<br />
                return cache[arguments[argPos]];<br />
            }<br />
            else {<br />
                if (!(arguments[argPos] in cache)) {<br />
                    cache[arguments[argPos]] = memoizeArg(argPos &#8211; 1);<br />
                }<br />
                return cache[arguments[argPos]].apply(this, arguments);<br />
            }<br />
        }<br />
    }<br />
    // JScript doesn&#8217;t grok the arity property, but uses length instead<br />
    var arity = func.arity || func.length;<br />
    return memoizeArg(arity &#8211; 1);<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cloud</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-145003</link>
		<dc:creator>cloud</dc:creator>
		<pubDate>Fri, 03 Apr 2009 15:12:49 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-145003</guid>
		<description>我根据你的也做了个

var Every = function(array, callback, thisObject){
	if(array.every){
		return array.every(callback, thisObject);
	}else{
		for (var i = 0, len = array.length; i &lt; len; i++) {
			if(!callback.call(thisObject, array[i], i, array)) return false; 
		}
		return true;
	}
}


function Memoize(func, object){
	var caches = [];
    return function(){
		var args = Array.prototype.slice.call(arguments), len = args.length;
		for (var i = 0, n = caches.length; i &lt; n; i++) {
			var argC = caches[i][&quot;args&quot;];
			if( argC.length == len &amp;&amp; Every(argC, function(x, i){ return x === args[i]; })) return caches[i][&quot;result&quot;];
		}
		var result = func.apply(object, arguments);
		caches.push({&quot;args&quot;: args, &quot;result&quot;: result});
		return result;
    }
}

function fib(n){
	 if (n == 0 &#124;&#124; n == 1)
		 return 1;
	return fib(n-1) + fib(n-2);
}

fib = Memoize(fib);</description>
		<content:encoded><![CDATA[<p>我根据你的也做了个</p>
<p>var Every = function(array, callback, thisObject){<br />
	if(array.every){<br />
		return array.every(callback, thisObject);<br />
	}else{<br />
		for (var i = 0, len = array.length; i &lt; len; i++) {<br />
			if(!callback.call(thisObject, array[i], i, array)) return false;<br />
		}<br />
		return true;<br />
	}<br />
}</p>
<p>function Memoize(func, object){<br />
	var caches = [];<br />
    return function(){<br />
		var args = Array.prototype.slice.call(arguments), len = args.length;<br />
		for (var i = 0, n = caches.length; i &lt; n; i++) {<br />
			var argC = caches[i]["args"];<br />
			if( argC.length == len &amp;&amp; Every(argC, function(x, i){ return x === args[i]; })) return caches[i]["result"];<br />
		}<br />
		var result = func.apply(object, arguments);<br />
		caches.push({&#8220;args&#8221;: args, &#8220;result&#8221;: result});<br />
		return result;<br />
    }<br />
}</p>
<p>function fib(n){<br />
	 if (n == 0 || n == 1)<br />
		 return 1;<br />
	return fib(n-1) + fib(n-2);<br />
}</p>
<p>fib = Memoize(fib);</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 哉崽</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-75809</link>
		<dc:creator>哉崽</dc:creator>
		<pubDate>Fri, 18 Jul 2008 07:29:33 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-75809</guid>
		<description>晕，搞错了，作为对象的KEY可以的</description>
		<content:encoded><![CDATA[<p>晕，搞错了，作为对象的KEY可以的</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 哉崽</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-75776</link>
		<dc:creator>哉崽</dc:creator>
		<pubDate>Fri, 18 Jul 2008 06:10:55 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-75776</guid>
		<description>@闲耘
虽然join默认使用逗号分隔，但是作为key貌似不可以哦^-^</description>
		<content:encoded><![CDATA[<p>@闲耘<br />
虽然join默认使用逗号分隔，但是作为key貌似不可以哦^-^</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: domkey</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-64128</link>
		<dc:creator>domkey</dc:creator>
		<pubDate>Mon, 12 May 2008 09:20:15 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-64128</guid>
		<description>这东西似乎只能用在一个函数上。绑两个以上的函数就冲突了，想法很好但还要再通用些吧。</description>
		<content:encoded><![CDATA[<p>这东西似乎只能用在一个函数上。绑两个以上的函数就冲突了，想法很好但还要再通用些吧。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: muqiao</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-63483</link>
		<dc:creator>muqiao</dc:creator>
		<pubDate>Wed, 07 May 2008 02:02:55 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-63483</guid>
		<description>你的文章回复系统 怎么设置的
我的回复http://hi.baidu.com/emkiao/blog/item/6612caedb8e0c3d1b21cb124.html</description>
		<content:encoded><![CDATA[<p>你的文章回复系统 怎么设置的<br />
我的回复http://hi.baidu.com/emkiao/blog/item/6612caedb8e0c3d1b21cb124.html</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: muqiao</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-63480</link>
		<dc:creator>muqiao</dc:creator>
		<pubDate>Wed, 07 May 2008 01:46:13 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-63480</guid>
		<description>函数中包含global对象 就不能用这个函数了</description>
		<content:encoded><![CDATA[<p>函数中包含global对象 就不能用这个函数了</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dexter_yy</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-61451</link>
		<dc:creator>dexter_yy</dc:creator>
		<pubDate>Sun, 27 Apr 2008 03:05:20 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-61451</guid>
		<description>…评论有字数限制么…

我贴到BLOG上了：http://www.limboy.com/2008/04/27/javascript_memoization/</description>
		<content:encoded><![CDATA[<p>…评论有字数限制么…</p>
<p>我贴到BLOG上了：http://www.limboy.com/2008/04/27/javascript_memoization/</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dexter_yy</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-61380</link>
		<dc:creator>dexter_yy</dc:creator>
		<pubDate>Sat, 26 Apr 2008 20:16:09 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-61380</guid>
		<description>不应该把参数拼成字符串作key，如果参数里有object或数组之类的就败了哑，不如改成这样：

function Memoize(fn){
    var cache = {}, args = [];
    return function(){
		for( var i=0, key = args.length; i  second.length ) ? first.length : second.length; i</description>
		<content:encoded><![CDATA[<p>不应该把参数拼成字符串作key，如果参数里有object或数组之类的就败了哑，不如改成这样：</p>
<p>function Memoize(fn){<br />
    var cache = {}, args = [];<br />
    return function(){<br />
		for( var i=0, key = args.length; i  second.length ) ? first.length : second.length; i</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 闲耘</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-60706</link>
		<dc:creator>闲耘</dc:creator>
		<pubDate>Wed, 23 Apr 2008 15:14:44 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-60706</guid>
		<description>refresh希望渺茫。
另，参数唯一性：参数本身使用逗号分隔，何不将就。
var key = Array.prototype.join.call(arguments);</description>
		<content:encoded><![CDATA[<p>refresh希望渺茫。<br />
另，参数唯一性：参数本身使用逗号分隔，何不将就。<br />
var key = Array.prototype.join.call(arguments);</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dragon</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-60696</link>
		<dc:creator>Dragon</dc:creator>
		<pubDate>Wed, 23 Apr 2008 14:27:02 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-60696</guid>
		<description>提个建议，要是Memoize函数能够接受 Refresh参数就更好了，
毕竟实际应用中有需要刷新cache 的需求。

btw，仰慕博主的威名，希望和博主有更多交流，方便请加我MSN：dylanjia@hotmail.com

期盼！</description>
		<content:encoded><![CDATA[<p>提个建议，要是Memoize函数能够接受 Refresh参数就更好了，<br />
毕竟实际应用中有需要刷新cache 的需求。</p>
<p>btw，仰慕博主的威名，希望和博主有更多交流，方便请加我MSN：dylanjia@hotmail.com</p>
<p>期盼！</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 闲耘</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-60634</link>
		<dc:creator>闲耘</dc:creator>
		<pubDate>Wed, 23 Apr 2008 07:54:04 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-60634</guid>
		<description>学习了。之前有关于“兼容性记忆体”的想法：就是浏览器在第一次执行某兼容代码时，记忆此时选择执行的分支，以确认当前浏览器支持的对象/方法，在以后的执行过程中，直接使用记忆体里的对象/方法。部分示例如下：
XmlHttpRequest.AXO = [
&#039;MSXML3.XMLHTTP.5.0&#039;,
&#039;MSXML3.XMLHTTP.4.0&#039;,
&#039;MSXML3.XMLHTTP.3.0&#039;,
&#039;MSXML3.XMLHTTP.2.0&#039;,
&quot;Msxml3.XMLHTTP&quot;,
&quot;Msxml2.XMLHTTP.5.0&quot;,
&quot;Msxml2.XMLHTTP.4.0&quot;,
&quot;Msxml2.XMLHTTP.3.0&quot;,
&quot;Msxml2.XMLHTTP&quot;,
&quot;Microsoft.XMLHTTP&quot;];
XmlHttpRequest.AXOI=0; // 兼容性记忆体。
...
if(window.ActiveXObject){ // 支持ActiveX的（ie）
  for (var i=XmlHttpRequest.AXOI, l=XmlHttpRequest.AXO.length; i</description>
		<content:encoded><![CDATA[<p>学习了。之前有关于“兼容性记忆体”的想法：就是浏览器在第一次执行某兼容代码时，记忆此时选择执行的分支，以确认当前浏览器支持的对象/方法，在以后的执行过程中，直接使用记忆体里的对象/方法。部分示例如下：<br />
XmlHttpRequest.AXO = [<br />
'MSXML3.XMLHTTP.5.0',<br />
'MSXML3.XMLHTTP.4.0',<br />
'MSXML3.XMLHTTP.3.0',<br />
'MSXML3.XMLHTTP.2.0',<br />
"Msxml3.XMLHTTP",<br />
"Msxml2.XMLHTTP.5.0",<br />
"Msxml2.XMLHTTP.4.0",<br />
"Msxml2.XMLHTTP.3.0",<br />
"Msxml2.XMLHTTP",<br />
"Microsoft.XMLHTTP"];<br />
XmlHttpRequest.AXOI=0; // 兼容性记忆体。<br />
&#8230;<br />
if(window.ActiveXObject){ // 支持ActiveX的（ie）<br />
  for (var i=XmlHttpRequest.AXOI, l=XmlHttpRequest.AXO.length; i</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: realazy</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-60624</link>
		<dc:creator>realazy</dc:creator>
		<pubDate>Wed, 23 Apr 2008 06:37:38 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-60624</guid>
		<description>@魏中华 

或许我没说得太明白。我的意思是，在自动完成的输入过程中，在客户端缓存已经查找过的结果，在没有离开页面时，再次查找相同的值时，直接使用缓存结果了，并不用重新请求（即使请求已经缓存），而且也节省了函数的运行时间。</description>
		<content:encoded><![CDATA[<p>@魏中华 </p>
<p>或许我没说得太明白。我的意思是，在自动完成的输入过程中，在客户端缓存已经查找过的结果，在没有离开页面时，再次查找相同的值时，直接使用缓存结果了，并不用重新请求（即使请求已经缓存），而且也节省了函数的运行时间。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: arthuridea</title>
		<link>http://chen.xianan.name/blog/2008/04/22/javascript-memoization/comment-page-1/#comment-60564</link>
		<dc:creator>arthuridea</dc:creator>
		<pubDate>Wed, 23 Apr 2008 02:08:52 +0000</pubDate>
		<guid isPermaLink="false">http://realazy.org/blog/2008/04/22/javascript-memoization/#comment-60564</guid>
		<description>现在的前端开发对于程序的效率越来越高也越来越体系化了。。。
不错，学习中。。</description>
		<content:encoded><![CDATA[<p>现在的前端开发对于程序的效率越来越高也越来越体系化了。。。<br />
不错，学习中。。</p>
]]></content:encoded>
	</item>
</channel>
</rss>
