<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.1.2" -->
<rss version="0.92">
<channel>
	<title>垃圾回收站</title>
	<link>http://panweizeng.com/document</link>
	<description>咕噜咕噜</description>
	<lastBuildDate>Mon, 16 Jun 2008 05:07:06 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>母版页判断登陆 及 母版页与内容页的执行顺序</title>
		<description>http://www.cnblogs.com/cooolbin/archive/2008/04/18/1160394.html
在checkLogin.cs里有check方法：

public static void check(Page aPage)
{
if (aPage.Session["ok"] == null &#124;&#124; aPage.Session["ok"].ToString() != "ok")
{
aPage.Response.Redirect("login.aspx");
}
}

在母版页里调用的正确方法：

protected void Page_Init(object sender, EventArgs e)
{
checkLogin.check(this.Page);
}

原因：

母版页和内容页的执行顺序：

1.母版页中控件的Init;
2.内容页控件的Init;
3.母版页的Init;
4.内容页的Init;
5.内容页的Load;
6.母版页的Load;
7.内容页中控件的Load;
8.内容页的PreRender;
9.母版页的PreRender;
10.母版页控件的PreRender;
11.内容页中控件的PreRender

出错方法：

１、checkLogin.check(mypage);
运行：MasterPage类转Page类出错

２、Page mypage=new Page();
checkLogin.check(mypage);
运行：System.Web.HttpException: 响应在此上下文中不可用。

３、用户自定义控件MasterPublicMethod.ascx，调用检查方法
protected void Page_Load(object sender, EventArgs e)
{
checkLogin.check(this.Page);
}
控件加入母版页：
这个方法改成：在母版页的Page_Load事件里：checkLogin.check(this.Page);
运行：正常
出错原因：事件执行顺序：内容页的Page_Load事件-&#62;母版页的Page_Load事件，要在页面最开始检查有没有登录

４、母版页：
protected void Page_Load(object sender, EventArgs e)
{
//Response.Write("母版");
checkLogin.check(this.Page);
}
内容页的Page_LoadComplete事件：
protected void Page_LoadComplete(Object sender, EventArgs e)
{
int t, bid;
//初始化自定义控件用的参数
pg = Convert.ToInt32(Request.QueryString["pg"]);
bid = Convert.ToInt32(Request.QueryString["id"]);
t = Convert.ToInt32(Request.QueryString["t"]);
switch (t)
{
case 1:
//回复
break;
case 2:
//修改回复
break;
case 3:
//隐藏
HideBook(bid);
break;
case 4:
//删除
DelBook(bid);
break;
}
}
修改原因：页面执行顺序：内容页的Page_Load-&#62;母版页的Page_Load-&#62;内容页的Page_LoadComplete
运行：自定义控件里有变量未赋值出错
出错原因：有的内容页里有自定义控件，自定义控件的Page_Load事件里有代码，自定义控件的参数在内容页的Page_LoadComplete事件里初始化
Page_Load的执行顺序：内容Page_Load-&#62;母版Page_Load-&#62;自定义控件Page_Load-&#62;内容Page_LoadComplete </description>
		<link>http://panweizeng.com/document/archives/218</link>
			</item>
	<item>
		<title>10年编程无师自通</title>
		<description>FooSleeper 翻译&#160;&#160; 更新：2005-01-12 10:18:06&#160; 版本: 1.09&#160;&#160;&#160;   原文：Teach Yourself Programming in Ten Years   作者：Peter Norvig    翻译：郭晓刚（foosleeper@163.net）    最后修订日期：2004-3-19    2005-01-12增加了新的译本链接。   本中文译本得到了Peter Norvig的许可。   为什么每个人都急不可耐？   走进任何一家书店，你会看见《Teach Yourself Java in 7 Days》（7天Java无师自通）的旁边是一长排看不到尽头的类似书籍，它们要教会你Visual Basic、Windows、Internet等等，而只需要几天甚至几小时。我在Amazon.com上进行了如下搜索：    pubdate: ...</description>
		<link>http://panweizeng.com/document/archives/217</link>
			</item>
	<item>
		<title>Javascript风格要素</title>
		<description>http://dancewithnet.com/2008/01/26/the-elements-of-javascript-style-part-one/  程序设计是困难的，其核心是管理的复杂性。计算机程序是人类做出的最复杂的东西。质量是不可靠的且隐蔽的。   好的体系架构是必需给程序足够的结构使其健壮而不会陷入混乱的泥淖，但我们表达一个程序细节的方式是同等重要的。一个程序的本质会被不良的编码所隐藏。只有当一个程序的表达清晰时，我们才能有希望正确的推理出它的效率、安全和正确性。   William Strunk的《风格要素》(The Elements of Style)是关于文学风格的经典著作，它是一本关于英文写作的薄手册，在用法、组织和形式上提出忠告。风格的理念应用于编程，在1972年Kreitzberg和Shneiderman的《FORTRAN风格要素》（The Elements of FORTRAN Style）中是不成功的，但在1978年的Kernighan和Plauger的《编程风格要素》（The Elements of Programming Style）中是非常成功的：   好的编程不能通过笼统的说教。学习编程的好方法是一次又一次的思考：真正的编程是如何通过一些良好实践的原则和一点常识来进行改进的。   他们从他们批评和改进的其他的编程教科书中筛选程序。   当我们在这里谈论风格时，我们谈论的不是潮流或者时尚，也不是CSS、布局惯例或排版。我们正在谈论的是能真正提高代码价值的表达式的永恒品质。对于公司来说，他们的评估和他们的代码是息息相关的，风格应该是一个至关重要的受关注内容。   我们使用许多编程语言，但在某一方面，Javascript是最重要的，它是浏览器的语言。当人们访问我们的站点时，他们将邀请我们的Javascript程序在他们的机器中执行。我们有义务使那些程序执行好。   没有好的关于Javascript编程的课本。在网页使用Javascript的大多数人学习它是通过从糟糕的书、糟糕的站点和糟糕的工具中复制相当糟糕的例子。我们这里有极好的Javascript程序员社区，但我们依旧能从较好的风格实践中获益。   为了证明这个问题，我将从公共网站中抽取一些程序，展示它们如何能被改进。这并不是我有意为难任何人。我的意图仅是通过例子展示风格的价值。我不会保留任何秘密：我展示给你的是我们已经传送给世界上的每一个人。   淘汰过时结构   下面的例子是2005-09-19摘自www.yahoo.com：   &#60;script language=javascript&#62;&#60;!--  ...</description>
		<link>http://panweizeng.com/document/archives/216</link>
			</item>
	<item>
		<title>A Survey of the JavaScript Programming Language</title>
		<description>A Survey of the JavaScript Programming Language   简介   这篇文章是为专业程序员介绍的JavaScript语言的，它是一种小巧的语言，如果你熟悉其他的编程语言，那么这篇文章对你来讲不是那么难以理解。   JavaScript不是Java，他们是两门完全不同的语言，JavaScript不是Java的子集，JavaScript不能被认为是Java(Java就是Java)。JavaScript分享了像Java一样分享C语言的语法，但从更深角度讲JavaScript更与Scheme 和Self有相似之处。它是一门小巧的语言，但是它确实强大的和丰富的语言。你应该好好观察一下它，你会发现它不是一个玩具语言，而是一个拥有许多与众不同特性的、完整的语言。   JavaScript是一门不用花太多时间学习的正规语言。它能更好地适合一些任务，比如与Java相比它更适合客户端编程。以我的实践经验，我发现用JavaScript工作使我成为一个更好的Java程序员，因为它给我带来一套丰富的技巧。   当我最初接触JavaScript时，我没有理他以为它不值得我的注意。后来，我对它刮目相看，因为我发现隐藏在浏览器中的它是一个如此有效的程序语言。我最初是在JavaScript在Sun和Netscape公司的初始陈述注意到它的。他们对JavaScript做了许多错误陈述，以免使它和Java处于竞争的位置。这些错误陈述继续充斥这那些只为傀儡和业余爱好者提供的、不好的JavaScript书中。   历史   JavaScript是被Netscape的Brendan Eich，作为一个页面脚本语言，在Navigator 2中开发的。它是一个非常具有表现力的动态程序语言，因为和浏览器的关系，它立刻变的大红大紫了。它从来没有得到一个可以校正它的问题的和基于真正使用目的测试周期，这一切导致它很强大却也有缺陷。   这篇文章描述了ECMAScript 版本3 (也叫 JavaScript 1.5)。 Microsoft和Netscape一起开发了一个没有改正缺陷的呆滞版本。新版本的语言也许不能叫JavaScript，也不在这篇文章的讨论范围内。   数据类型   JavaScript包含一小套数据类型，它有3种简单的类型：boolean, number, 和 string;特殊的值：null,undefined;其他的所有基于object类型的变化。   ...</description>
		<link>http://panweizeng.com/document/archives/215</link>
			</item>
	<item>
		<title>三个关键命令找出ASP.NET程序内存分片的原因</title>
		<description>http://www.cnblogs.com/lixiong/archive/2007/10/26/938430.html  最近一位朋友的ASP.NET程序怀疑有内存泄露问题。几个简单的页面，起来运行几分钟后，虚拟内存就到600多MB。从性能监视上看，private bytes只有200多MB。   这样的问题从经验上来说，十有八九都是内存碎片了。ASP.NET程序发生内存碎片的原因比较多，我常见的有:   1. Web.config中的debug=true，导致batch compilation=false,使得每一个ASPX页面都生成一个临时assembly。当页面比较多的时候，大量的assembly导致内存泄露。   2. 程序中误用了XmlSerializer。频繁的XML序列化导致大量的动态assembly    3. 程序中有大量的blocking IO操作，而且IO buffer没有及时释放。比如程序中有大量的Web Service调用，但是对方web service返回比较慢，使得调用程序中用来接收web service结果的小块buffer大量堆积，导致内存泄露   下面是我拿到dump后的分析步骤。对于managed程序，找出问题的大致线索还是挺简单的。   (随便无耻地推销下，《Windows高效排错》书中对这样的问题有更多的讨论。包括更多的案例和命令解释。该书最初的PDF草稿在http://www.cnblogs.com/lixiong/archive/2006/08/16/475520.html。如果有朋友从这个PDF中找到过排错的灵感，麻烦也帮忙无耻推销下。)   首先是看看CLR的版本了。这个直接看mscorwks文件或者mscorsrv文件。如果文件版本比较低，后面的就没必要仔细看了，升级CLR补丁后再说。   0:000&#62; lmvm mscorwks   start&#160;&#160;&#160; end&#160;&#160;&#160;&#160;&#160;&#160;&#160; module name    79e70000 ...</description>
		<link>http://panweizeng.com/document/archives/214</link>
			</item>
	<item>
		<title>关于JavaScript中apply与call的用法意义及区别</title>
		<description>
http://www.cnblogs.com/beyondnet/archive/2007/12/06/985216.html
JavaScript中有一个call和apply方法，其作用基本相同，但也有略微的区别。
先来看看JS手册中对call的解释：call 方法调用一个对象的一个方法，以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数thisObj可选项。将被用作当前对象的对象。
arg1, arg2, , argN可选项。将被传递方法参数序列。
说明call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数，那么 Global 对象被用作 thisObj。
说明白一点其实就是更改对象的内部指针，即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。
引用网上一个代码段，运行后自然就明白其道理。&#60;input type="text" id="myText" value="input text"&#62;&#60;script&#62;function Obj(){this.value="对象！";}var value="global 变量";function Fun1(){alert(this.value);}
window.Fun1(); //global 变量Fun1.call(window); //global 变量Fun1.call(document.getElementById('myText')); //input textFun1.call(new Obj()); //对象！&#60;/script&#62;
call函数和apply方法的第一个参数都是要传入给当前对象的对象，及函数内部的this。后面的参数都是传递给当前对象的参数。运行如下代码：&#60;script&#62;var func=new function(){this.a="func"}var myfunc=function(x){var a="myfunc";alert(this.a);alert(x);}myfunc.call(func,"var");&#60;/script&#62;
可见分别弹出了func和var。到这里就对call的每个参数的意义有所了解了。
对于apply和call两者在作用上是相同的，但两者在参数上有区别的。对于第一个参数意义都一样，但对第二个参数：apply传入的是一个参数数组，也就是将多个参数组合成为一个数组传入，而call则作为call的参数传入（从第二个参数开始）。如 func.call(func1,var1,var2,var3)对应的apply写法为：func.apply(func1,[var1,var2,var3])
同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入。
 </description>
		<link>http://panweizeng.com/document/archives/212</link>
			</item>
	<item>
		<title>总有一种力量让我们泪流满面</title>
		<description>
难忘《南方周末》1999年新年致词：总有一种力量让我们泪流满面这是新年的第一天，这是我们与你见面的第777次。祝愿阳光打在你的脸上。阳光打在你的脸上，温暖留在我们的心里。这是冬天里平常的一天。北方的树叶已经落尽，南方的树叶还留在枝上，人们在大街上懒洋洋地走着，或者急匆匆地跑着，每个人都怀着自己的希望，每个人都握紧自己的心事。没有什么可以轻易把人打动，除了正义的号角。当你面对蒙冤无助的弱者，当你面对专横跋扈的恶人，当你面对足以影响人们一生的社会不公，你就明白正义需要多少代价，正义需要多少勇气。没有什么可以轻易把人打动，除了内心的爱。没有什么可以轻易把人打动，除了前进的脚步…… 这是新年的第一天，就象平常一样，我们与你再次见面，为逝去的一年而感怀，为新来的一年作准备。祝愿阳光打在你的脸上。阳光打在你的脸上，温暖留在我们的心里。有一种力量，正从你的指尖悄悄袭来，有一种关怀，正从你的眼中轻轻放出。在这个时刻，我们无言与对，惟有祝福：让无力者有力，让悲观者前行，让往前走的继续走，让幸福的人儿更幸福；而我们，则不停为你加油。我们不停为你加油。因为你的希望就是我们的希望，因为你的苦难就是我们的苦难。我们看着你举起锄头，我们看着你舞动镰刀，我们看着你挥汗如雨，我们看着你谷满粮仓。我们看着你流离失所，我们看着你痛哭流涕，我们看着你中流击水，我们看着你重建家园。我们看着你无奈下岗，我们看着你咬紧牙关，我们看着你风雨度过，我们看着你笑逐颜开……我们看着你，我们不停为你加油，因为我们就是那你们的一部分。总有一种力量它让我们泪流满面，总有一种力量它让我们抖擞精神，总有一种力量他驱使我们不断寻求"正义、爱心、良知"。这种力量来自于你，来自于你们中间的每一个人。所以，在这样的时候，在这新年的第一天，我们有向你、向你身边的每一个人，说一声，"新年好"！祝愿阳光打在你的脸上。因为有你，才有我们。阳光打在你的脸上，温暖留在我们的心里。为什么我们总是眼含泪珠，因为我们爱得深沉；为什么我们总是精神抖擞，因为我们爱得深沉；为什么我们总在不断寻求，因为我们爱得深沉。爱这个国家，还有她的人民，他们善良，他们正直，他们懂得互相关怀。
 </description>
		<link>http://panweizeng.com/document/archives/211</link>
			</item>
	<item>
		<title>测试文档</title>
		<description>

 </description>
		<link>http://panweizeng.com/document/archives/210</link>
			</item>
	<item>
		<title>困扰80后御宅族的十大烦恼之症状</title>
		<description>
以下80后御宅族十大烦恼的症候特征,，一般80后都占了三五条，一个80后的朋友更惊呼自己几乎一条不少全占了--1.成天泡在网上，又不知道做什么好。80后最常说的一句话是"无聊"，尽管他们在网络上聊天花去了大把的时间。建议：聊天作为一种基本交流方式，所要达到的目的是获得认同。网上聊天很难达到这种认同，所以越聊越无聊。学习和工作累了，玩一玩游戏没错，但是打怪练级那些游戏基本上是得不偿失的，费时间，伤身体，还花钱。可以玩一玩趣味性强的休闲游戏，比如《纸客帝国》之类，轻松幽默，带点无厘头的风格，很能消除疲劳。靠玩游戏来交流感情是不现实的，要交流感情最好还是找个人去咖啡吧，或者堡个电话粥吧。2.浮躁，好预测未知妄下定论。对看过的电影和电视剧，会按耐不住向别人透露下一个情节或者结局。对不了解的事物，根 据一丁点信息发表长篇大论的见解，并且多半是批判的。对权威毫无理由的不耐烦，但绝不公开挑战，只热衷于影响身边的几个人，并有得到认同的强烈欲望。一旦 不能如愿，就不再发言，部分人会暴跳如雷，令旁人费解。建议：多出去旅行，多读书，多参加团体活动，多接触社会。世界的绝大部分真相在我们的视野之外，浮躁是个人修养浅薄的表现，人既是社会成员也是自然的组成部分，需要积淀对世界尽可能的多认识，才能达到意识的足够高度，才能让人看起来不那么浮躁。3.瘦弱，不爱运动。对健壮的人心存嘲讽，对肌肉和力量心存恐惧。在审美上受日式漫画的影响，崇尚中性美和病态美。与 第一点有一定关系，在身体的耐力、韧性和爆发力上，更热衷于后者。但是在受到刺激之后，又会表现出病态的固执。这样就表现为两个极端，一方面弱不禁风，另 一方面又偶尔会有惊人之举。建议：健身，多进行户外运动。身体是人最接近自然的组成部分，一个健康强壮不容易被击倒的身体可以让我们终生收益。4.性格软弱，喜欢为自己的意志不坚定找理由。不喜欢通过沟通达到与外界的意见统一，而是表面妥协，内心强烈反感，表 现为通常所说的叛逆。性格软弱表现在与异性相处方面就是易犯花痴，对异性的正常关怀想入非非。在弄清楚是怎么回事之后，即使真的喜欢对方，也不敢大胆追 求，而是找个理由退缩。通常的理由是说自己不了解爱情，也不想了解。建议：堂而皇之的与人打一架，正儿八经的谈一次恋爱。从自然法则的角度考虑的，作为雄性动物，与同性生物打架和向异性求爱都是走向成熟的标志。5.消极，拒绝长大。不喜欢被人说成熟，尤其不能容忍被人说是老男人。不耐烦与长辈讨论一些实际的问题，反感政治，厌恶参加长辈在场的应酬。要负责任的事情，会让他们觉得焦虑不安和无奈。建议：尝试了解父母的不易。也可以从哲学层面去了解索取和付出之间的辩证关系，就象课本里所说的权利和义务的关系。6.选择性自闭，对熟人唠叨不休，对陌生人一言不发。偏爱使用方言或者网络语言等非大众语言。吸烟，但是不敬烟。喝酒，但是不敬酒。不是他们感兴趣的话题，基本上很难交谈下去。多人参与讨论时，如果没有人邀请他发言，即使他已酝酿好发言稿，还是会选择沉默。建议：这些其实都是在沟通上遇到的困难。建议扩大知识面，扩大社交圈，改变与人交谈的方式，勇敢表达自己的见解，努力将自己的观点传达并影响其他人。获得认同后就会产生激励，反复几次，就可以走出自闭。7.习惯熬夜，25岁之前通宵次数明显较多。有时候为了"合理安排时间"，干脆用通宵来减少熬夜次数。实际上下半夜都在打瞌睡。建议：与第5点相同，熬夜其实就是自闭在作怪。有熬夜习惯的人，白天就找到了关门睡觉的理由，避免了外界的骚扰。或者白天虽然没有在家睡觉，因为精神上萎靡不振，能造成"外界不关我事"的错觉，也能达到抵制外界骚扰的目的。建议立刻改变作息时间，打开心扉。8.毫无理由的高傲。觉得别人不可能了解自己，并以此作为对别人不屑的理由。不愿意听别人的建议，也听不进。这种高傲连他们自己都不知道为什么。建议：由于时代因素，80后的自尊更为脆弱，从心理上就更趋向于自我保护，表现为对外界不信任。建议多了解一些社会规则，不管在什么场合，只要你在规则之内，你就是安全的，可以自由表达自己的存在价值。9.做事不按计划，讨厌按部就班，永远不知道钱花到哪里去了。以同时看多部小说，守多部漫画为荣。喜欢同时着手几件事，忙得焦头烂额是他们喜欢的状态，尽管这些事情只要合理安排是完全可以按部就班轻松完成的。建议：欲速则不达这个道理就不用说了吧。学会制定计划，可以避免紧急情况下全面崩盘的风险。10.不问问题，相信百度和谷歌的权威，多数人喜欢用搜索引擎思考，将搜索引擎作为自己的智囊。建议：互联网确实给了我们许多方便，但是互联网上的东西很多都是未经考证，经不起推敲的。所以要避免犯错，这个地方正需要80后拿出怀疑精神来，不能依赖互联网而使自身的学习功能退化了。
 </description>
		<link>http://panweizeng.com/document/archives/209</link>
			</item>
	<item>
		<title>在Javascript中，什么是闭包(Closure)</title>
		<description>
闭包的两个特点：
1、作为一个函数变量的一个引用 - 当函数返回时，其处于激活状态。
2、一个闭包就是当一个函数返回时，一个没有释放资源的栈区。
例1。
&#60;scripttype="text/javascript"&#62;
functionsayHello2(name){
vartext='Hello'+name;//localvariable
varsayAlert=function(){alert(text);}
returnsayAlert;
}
varsy=sayHello2('never-online');
sy();
&#60;/script&#62;
作为一个Javascript程序员，应该明白上面的代码就是一个函数的引用。如果你还不明白或者不清楚的话，请先了解一些基本的知识，我这里不再叙述。
上面的代码为什么是一个闭包？
因为sayHello2函数里有一个内嵌匿名函数
sayAlert = function(){ alert(text); }
在Javascript里。如果你创建了一个内嵌函数（如上例），也就是创建了一个闭包。
在C或者其它的主流语言中，当一个函数返回后，所有的局部变量将不可访问，因为它们所在的栈已经被消毁。但在Javascript里，如果你声明了一个内嵌函数，局部变量将在函数返回后依然可访问。比如上例中的变量sy，就是引用内嵌函数中的匿名函数function(){ alert(text); }，可以把上例改成这样：
&#60;scripttype="text/javascript"&#62;
functionsayHello2(name){
vartext='Hello'+name;//localvariable
varsayAlert=function(){alert(text);}
returnsayAlert;
}
varsy=sayHello2('never-online');
alert(sy.toString());
&#60;/script&#62;
这里也就与闭包的第二个特点相吻合。
例2。
&#60;scripttype="text/javascript"&#62;
functionsay667(){
//Localvariablethatendsupwithinclosure
varnum=666;
varsayAlert=function(){alert(num);}
num++;
returnsayAlert;
}
varsy=say667();
sy();
alert(sy.toString());
&#60;/script&#62;
上面的代码中，匿名变量function() { alert(num); }中的num，并不是被拷贝，而是继续引用外函数定义的局部变量--num中的值，直到外函数say667()返回。
例3。
&#60;scripttype="text/javascript"&#62;
functionsetupSomeGlobals(){
//Localvariablethatendsupwithinclosure
varnum=666;
//Storesomereferencestofunctionsasglobalvariables
gAlertNumber=function(){alert(num);}
gIncreaseNumber=function(){num++;}
gSetNumber=function(x){num=x;}
}
&#60;/script&#62;
&#60;buttononclick="setupSomeGlobals()"&#62;生成-setupSomeGlobals()&#60;/button&#62;
&#60;buttononclick="gAlertNumber()"&#62;输出值-gAlertNumber()&#60;/button&#62;
&#60;buttononclick="gIncreaseNumber()"&#62;增加-gIncreaseNumber()&#60;/button&#62;
&#60;buttononclick="gSetNumber(5)"&#62;赋值5-gSetNumber(5)&#60;/button&#62;
上例中，gAlertNumber, gIncreaseNumber, gSetNumber都是同一个闭包的引用，setupSomeGlobals()，因为他们声明都是通过同一个全局调用--setupSomeGlobals()。
你可以通过"生成"，"增加"，"赋值"，"输出值"这三个按扭来查看输出结果。如果你点击"生成"按钮，将创建一个新闭包。也就会重写gAlertNumber(), gIncreaseNumber(), gSetNumber(5)这三个函数。
如果理解以上代码后，看下面的例子：
例4。
&#60;scripttype="text/javascript"&#62;
functionbuildList(list){
varresult=[];
for(vari=0;i&#60;list.length;i++){
varitem='item'+list[i];
result.push(function(){alert(item+''+list[i])});
}
returnresult;
}
functiontestList(){
varfnlist=buildList([1,2,3]);
//usingjonlytohelppreventconfusion-couldusei
for(varj=0;j&#60;fnlist.length;j++){
fnlist[j]();
}
}
testList();
&#60;/script&#62;
运行结果:
item3isundefined
item3isundefined
item3isundefined
代码result.push(function(){alert(item+''+list[i])})，
使result数组添加了三个匿名函数的引用。这句代码也可以写成
varp=function(){alert(item+''+list[i])};
result.push(p);
关于为什么会输出三次都是 "item 3 is undefined"
在上面的例子say667()例子中已经解释过了。
匿名函数function() {alert(item + ' ' + list[i])}中的list[i]并不是经过拷贝，而是对参数list的一个引用。直到函数buildList()返回为止，也就是说，返回最后一个引用。即遍历完list（注：list的最大下标应该是2）后，经过i++也就变成了3，这也就是为什么是item 3，而list[3]本身是没有初始化的，自然也就是undefined了。
在这最后一个例子中，展示如何声明两个不同的闭包。
例5。
function newClosure(someNum, someRef) {// Local variables that end up within closurevar num = someNum;var anArray = [1,2,3];var ref = someRef;return function(x) {num = x;anArray.push(num);alert('num:' ...</description>
		<link>http://panweizeng.com/document/archives/208</link>
			</item>
</channel>
</rss>
