<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>VILIC&#039;s Blog</title>
	<atom:link href="http://www.vilic.info/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.vilic.info/blog</link>
	<description>万松恒的博客 - 看出来了么, 我是一个人...</description>
	<lastBuildDate>Tue, 17 Apr 2012 03:57:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>如果辟谣本身就是谣言</title>
		<link>http://www.vilic.info/blog/archives/796</link>
		<comments>http://www.vilic.info/blog/archives/796#comments</comments>
		<pubDate>Tue, 17 Apr 2012 03:57:01 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[伸手摸]]></category>
		<category><![CDATA[广电总局]]></category>
		<category><![CDATA[泰坦尼克]]></category>
		<category><![CDATA[谣言]]></category>
		<category><![CDATA[辟谣]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=796</guid>
		<description><![CDATA["伸手摸" 这个段子像爆炸一样传开, 一开始只是在中文网络圈, 最近逐渐蔓延到国外媒体. 最后看到卡梅隆接受脱口秀采访, 亲口说 "他们是害怕中国男人会向着银幕, 伸出手来摸", 并且紧接着强调 "This is true" 的时候, 我知道这是近年来最成功的假新闻了. -- 或许, 只是说或许, 上面这一段文字以及以这段文字打头的那篇所谓辟谣的一文, 才是近年来最成功的假新闻吧? 文章传开后不久, 国内很多知名门户网站上都出现了以此文为中心的辟谣文章, 但还好, 也还有足够理性的报道: &#60;如非 "官方" 请辟谣&#62; 北京晨报 当然, 到目前为止, 这个段子是真是假, 还难易断定, 我也不想去和谁打赌, 说它一定是真的. 但就其中人们对真假的判断, 还是说明绝大多数确是少了些思考. 为什么大家不相信国外那么多一线媒体, 不相信卡梅隆, 却愿意去相信一个未曾听闻的 "豆瓣逗你妹"? 有些人给出的答案或许是 "这种东西用臀部思考都知道它是假的!" 嗯, 如果真的能这么主观地去判断, 那国外一群媒体的编辑一定是没有臀部了. 不论对错, 我想多数人选择相信是谣言, 可能是出于以下原因: 根据生活常识, 认为所谓的广电的解释太离谱, 自己已经给它加上了 "疑似谣言" 的标签. 而现在, 突然有人一本正经地告诉你, "它就是谣言", 一瞬间找到了认同感, [...]]]></description>
			<content:encoded><![CDATA[<p>"伸手摸" 这个段子像爆炸一样传开, 一开始只是在中文网络圈, 最近逐渐蔓延到国外媒体. 最后看到卡梅隆接受脱口秀采访, 亲口说 "他们是害怕中国男人会向着银幕, 伸出手来摸", 并且紧接着强调 "This is true" 的时候, 我知道这是近年来最成功的假新闻了.</p>
<p>--</p>
<p>或许, 只是说或许, 上面这一段文字以及以这段文字打头的那篇所谓辟谣的一文, 才是近年来最成功的假新闻吧?</p>
<p>文章传开后不久, 国内很多知名门户网站上都出现了以此文为中心的辟谣文章, 但还好, 也还有足够理性的报道:</p>
<p><a href="http://rrurl.cn/6Mxh2M" target="_blank">&lt;如非 "官方" 请辟谣&gt; 北京晨报</a></p>
<p>当然, 到目前为止, 这个段子是真是假, 还难易断定, 我也不想去和谁打赌, 说它一定是真的. 但就其中人们对真假的判断, 还是说明绝大多数确是少了些思考.</p>
<p>为什么大家不相信国外那么多一线媒体, 不相信卡梅隆, 却愿意去相信一个未曾听闻的 "<a href="http://rrurl.cn/e2NT0B" target="_blank">豆瓣逗你妹</a>"? 有些人给出的答案或许是 "这种东西用臀部思考都知道它是假的!" 嗯, 如果真的能这么主观地去判断, 那国外一群媒体的编辑一定是没有臀部了. 不论对错, 我想多数人选择相信是谣言, 可能是出于以下原因:</p>
<p><strong>根据生活常识, 认为所谓的广电的解释太离谱, 自己已经给它加上了 "疑似谣言" 的标签. 而现在, 突然有人一本正经地告诉你, "它就是谣言", 一瞬间找到了认同感, 不能自拔, 完全无心去怀疑这个辟谣的真实性.</strong></p>
<p>于是, 在紧接着所谓的谣言火了之后, 这所谓的辟谣也火了. 但, 冷静下来, 很容易注意到两个疑点(虽然也有很多主观的判断).</p>
<p>1. 卡梅隆作为导演, 如果说广电总局剪掉了他电影的镜头, 势必会告知, 于是他会需要通过媒体的报道来获知自己的作品为什么会被剪掉某个镜头吗? 我想用不着吧?</p>
<p>2. 之前也提到, 国外很多一线媒体报道, 并且到现在为止, 仍然没有撤掉或者辟谣. 如果真的只是谣言, 广电总局会任由这些媒体给它丢脸而不提出辟谣, 或是要求媒体辟谣吗?</p>
<p>至于那篇写得很有说服力的辟谣文, 引用 &lt;如非 "官方" 请辟谣&gt; 一文中的话:</p>
<p><strong>"官方" 没有说话, 一位网友却发言了, 称这只是个段子, 是他最早编出来的, 几经传播就被当成 "官方说法" 传到了卡梅隆的耳朵里. 不过, 他的说法既难以证真, 也难以证伪, 除非能把传播的每一个环节找出来. 我们不禁要问: 这是真相吗, 还是他的段子不小心跟真相重合了?</strong></p>
<p>另外附上果壳上少量评论:</p>
<p>我要给卡梅隆发邮件！请他亲自辟谣。我要给扣扣熊发邮件，请他辟谣！- <a href="http://rrurl.cn/lgYs5S" target="_blank">老面包哎呀</a><br />
国内上映前2天我给广电网站发了邮件去询问这则消息，到现在果然没有什么回复，这也许就是假消息最好的载体了，没有什么有效的反馈，就像高铁事故里葛优的微博 - <a href="http://rrurl.cn/vmAwlh" target="_blank">陈浮生</a><br />
这种辟谣和谣言一样苍白无力，没有看到一样东西来佐证你的说法 - <a href="http://rrurl.cn/qxRosS" target="_blank">西部狂野</a><br />
话说是先有段子出现还是先有你在果壳？比较好奇这个。 - <a href="http://rrurl.cn/eQht5z" target="_blank">永远的大王</a>
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/796">http://www.vilic.info/blog/archives/796</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/796">http://www.vilic.info/blog/archives/796</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/796/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>浅谈Web程序设计中的面向数据的编程(DOP)</title>
		<link>http://www.vilic.info/blog/archives/791</link>
		<comments>http://www.vilic.info/blog/archives/791#comments</comments>
		<pubDate>Mon, 20 Feb 2012 05:37:35 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[JavaScript/AJAX]]></category>
		<category><![CDATA[DOP]]></category>
		<category><![CDATA[EOP]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[面向事件编程]]></category>
		<category><![CDATA[面向对象编程]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=791</guid>
		<description><![CDATA[所以说, 趋势就是趋势, 并不在于谁提出来, 该有的东西自然便会有. 我不知道我们这一代人是否算是见证了DOP的诞生, 但至少在这些年, DOP被用得越来越多了. 说到这个, 首先想提两点. 一个是之前众所周知的变成模式, 面向对象编程(OOP). 对与我来说, 面向对象在我的代码中扮演了相当重要的角色. 它让程序内部的交流变得更加清晰, 提升了程序的可读性, 降低了出现bug的概率. 在有些应用上, 到目前还是不能替代的. 另一个是今后Web编程的发展, 我目测会有几个大方向: 1. 基于Canvas或CSS3的Web游戏. 2. 功能复杂的Web应用程序(如在线办公). 3. 以内容呈现与交互为主的Web页面(如SNS). 只所以想要提这两点, 是为之后将要说到的OOP的局限性, 和DOP的应用范畴做铺垫. 那首先说说, 什么是DOP. 老实说, 我并非是从这个名字开始接触这个概念的, 而是从很多Web页面的改变上开始思考这个问题. 不过很自然地, 使用了同一个词语来描述这样同一个概念. 其实其中有一点YY的成分, 但我想也应该八九不离十. 如果说OOP让人们只用关心如何去调用一个功能, 而不用关心功能的实现的话, 那么DOP则只用人们去关心一个模块/对象所管理的数据, 而不用关心这些数据的改变会对其他模块/对象造成什么影响. 当然, 对自己的影响还是要关心的. 其实细想, 在一些高级编程语言中, 对象的属性就是一种简单地DOP模型. 但显然, 它是局限在某一个对象上的. 然而很多时候, 同一个数据在多个对象上是公用的, 这或许就是DOP和传统OOP一个很大的区别, 也是传统OOP的局限. 但说到这里, 大家可能也会有种想法, [...]]]></description>
			<content:encoded><![CDATA[<p>所以说, 趋势就是趋势, 并不在于谁提出来, 该有的东西自然便会有. 我不知道我们这一代人是否算是见证了DOP的诞生, 但至少在这些年, DOP被用得越来越多了.</p>
<p>说到这个, 首先想提两点. 一个是之前众所周知的变成模式, 面向对象编程(OOP). 对与我来说, 面向对象在我的代码中扮演了相当重要的角色. 它让程序内部的交流变得更加清晰, 提升了程序的可读性, 降低了出现bug的概率. 在有些应用上, 到目前还是不能替代的. 另一个是今后Web编程的发展, 我目测会有几个大方向: 1. 基于Canvas或CSS3的Web游戏. 2. 功能复杂的Web应用程序(如在线办公). 3. 以内容呈现与交互为主的Web页面(如SNS). 只所以想要提这两点, 是为之后将要说到的OOP的局限性, 和DOP的应用范畴做铺垫.</p>
<p>那首先说说, 什么是DOP. 老实说, 我并非是从这个名字开始接触这个概念的, 而是从很多Web页面的改变上开始思考这个问题. 不过很自然地, 使用了同一个词语来描述这样同一个概念. 其实其中有一点YY的成分, 但我想也应该八九不离十.</p>
<p>如果说OOP让人们只用关心如何去调用一个功能, 而不用关心功能的实现的话, 那么DOP则只用人们去关心一个模块/对象所管理的数据, 而不用关心这些数据的改变会对其他模块/对象造成什么影响. 当然, 对自己的影响还是要关心的. 其实细想, 在一些高级编程语言中, 对象的属性就是一种简单地DOP模型. 但显然, 它是局限在某一个对象上的. 然而很多时候, 同一个数据在多个对象上是公用的, 这或许就是DOP和传统OOP一个很大的区别, 也是传统OOP的局限.</p>
<p>但说到这里, 大家可能也会有种想法, 认为DOP也是OOP. 我认为这种想法是正确的, DOP的最佳实践应该对象化/模块化, 只是与直接调用其他对象的方法不同, 通过数据来间接达到目的. 这一点来讲, 倒和面向事件的编程(EOP)有些相似, 但事件是瞬时的, 而数据则是可持续的. 或许DOP约等于OOP+EOP+Data?</p>
<p>近年来, 在很多网站中出现了Hash, 很多MVC框架也支持相应的技术, 极大地方便了复杂的无刷新页面的实现, 这应该算是典型的DOP. 不过如果仅仅是这样, 还只能说是Hash上的数据在和整个页面一个对象交互, 这就有点伤感了. 还好看到一些框架, 并非这样的如果, 比如淘宝的MagixJS似乎就不错. 不过很显然, DOP也有其局限性, 毕竟中间穿插了一个环节, 在效率上或许比不过传统的变成手段. 所以像Web游戏的有些部分则是不便于使用的, 但我想做做UI还是完全能够胜任.</p>
<p>按我的理解, 相对于OOP, DOP能进一步减小复杂程序的思维难度, 提高开发效率, 以及降低bug的概率, 应该是未来Web编程某些方面的趋势, 于是我也有自己的DOP框架计划, 只是准备在DOP的基础上, 增加强大的模板功能, 也许未来, 很多AJAX操作, 都只需要一个简单的模板了.
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/791">http://www.vilic.info/blog/archives/791</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/791">http://www.vilic.info/blog/archives/791</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/791/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Windows 7 开机以管理员身份启动应用程序</title>
		<link>http://www.vilic.info/blog/archives/785</link>
		<comments>http://www.vilic.info/blog/archives/785#comments</comments>
		<pubDate>Sun, 25 Dec 2011 01:50:28 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[.NET/C#]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=785</guid>
		<description><![CDATA[这个也是最近做的代理整合软件过程中遇到的问题, 因为要修改Internet Settings, 可能还有其他一些操作, 需要有管理员权限, 强制程序使用管理员权限可以添加一个manifest文件, 再将其中的requestedExecutionLevel, level改为"requireAdministrator"即可. 其实当时做到这里, 我以为就大功告成了, 但重启之后发现程序没有启动, 搜了搜, 才知道是自动启动的家伙获取不了管理员权限. 最后找到的解决方法有二, 一个是先启动一个不需要管理员权限的程序, 再延时打开需要管理员权限的程序, 不过效果不理想, 也不知道延时多久才能搞定. 并且, 每次开机都会请求权限, 用户用着也不爽. (话说, 关了UAC多好... 这儿整个都不用了.) 后来发现了Task Scheduler(任务计划)这个东西, 顿时觉得捡到了宝, 于是继续查找各种资料, 发现不仅能启动, 还能以管理员权限启动. 不过貌似只能用在Windows Vista/7 上(XP上貌似也有任务计划, 但可能接口不同或者没这么强大吧, 这个我没有细查, 但代码在XP上的确会进入catch), 所以XP上还要优雅降级, 添加普通的开机启动项, 反正XP又没有UAC, 是吧. 我使用的是C#, 同时需要添加COM引用, TaskScheduler 1.1 Type Library, 在system32目录下的taskschd.dll. 代码如下: var dir = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; try { &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>这个也是最近做的代理整合软件过程中遇到的问题, 因为要修改Internet Settings, 可能还有其他一些操作, 需要有管理员权限, 强制程序使用管理员权限可以添加一个manifest文件, 再将其中的requestedExecutionLevel, level改为"requireAdministrator"即可. 其实当时做到这里, 我以为就大功告成了, 但重启之后发现程序没有启动, 搜了搜, 才知道是自动启动的家伙获取不了管理员权限.</p>
<p>最后找到的解决方法有二, 一个是先启动一个不需要管理员权限的程序, 再延时打开需要管理员权限的程序, 不过效果不理想, 也不知道延时多久才能搞定. 并且, 每次开机都会请求权限, 用户用着也不爽. (话说, 关了UAC多好... 这儿整个都不用了.)</p>
<p>后来发现了Task Scheduler(任务计划)这个东西, 顿时觉得捡到了宝, 于是继续查找各种资料, 发现不仅能启动, 还能以管理员权限启动. 不过貌似只能用在Windows Vista/7 上(XP上貌似也有任务计划, 但可能接口不同或者没这么强大吧, 这个我没有细查, 但代码在XP上的确会进入catch), 所以XP上还要优雅降级, 添加普通的开机启动项, 反正XP又没有UAC, 是吧.</p>
<p>我使用的是C#, 同时需要添加COM引用, TaskScheduler 1.1 Type Library, 在system32目录下的taskschd.dll. 代码如下:</p>
<blockquote class="vlight"><p>var dir = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";<br />
try {<br />
&nbsp; &nbsp; var scheduler = new TaskSchedulerClass();<br />
&nbsp; &nbsp; scheduler.Connect(); //连接, 还有一些登录参数可选.<br />
&nbsp; &nbsp; var task = scheduler.NewTask(0); //官方文档上, 这个参数后面加了注释reserved.<br />
&nbsp; &nbsp; task.RegistrationInfo.Author = "Pacgen";<br />
&nbsp; &nbsp; task.RegistrationInfo.Description = "Start Pacgen with Windows";<br />
&nbsp; &nbsp; task.Settings.Enabled = true; //or false, 开关.</p>
<p>&nbsp; &nbsp; //在启动的时候执行, 一开始只写了Logon, 不过发现开机的时候登录并没有触发.<br />
&nbsp; &nbsp; task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_BOOT);<br />
&nbsp; &nbsp; //注销后登录什么的.<br />
&nbsp; &nbsp; task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON);<br />
&nbsp; &nbsp; var action = task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC) as IExecAction;<br />
&nbsp; &nbsp; //上面的Triggers.Create也会像Actions.Create一样分别返回类型为IBootTrigger, ILogonTrigger的对象(自己as或者强制转换一下).<br />
&nbsp; &nbsp; //可以做更多设置.</p>
<p>&nbsp; &nbsp; //这里就是设置为用户能达到的最高权限.<br />
&nbsp; &nbsp; task.Principal.RunLevel = _TASK_RUNLEVEL.TASK_RUNLEVEL_HIGHEST;<br />
&nbsp; &nbsp; action.Path = Application.ExecutablePath; //需要启动的程序路径.<br />
&nbsp; &nbsp; action.Arguments = "background"; //参数.</p>
<p>&nbsp; &nbsp; var folder = scheduler.GetFolder(@"\"); //这里是Task的根文件夹, 还可以用folder.CreateFolder来创建自己的目录.</p>
<p>&nbsp; &nbsp; //注册任务. 这里的TASK_LOGON_INTERACTIVE_TOKEN就是说使用用户当前的登录信息(如果已经登录).<br />
&nbsp; &nbsp; folder.RegisterTaskDefinition("PacgenStartup", task, (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, null, null, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN);</p>
<p>&nbsp; &nbsp; //注册成功, 删除注册表内的启动项, 这里的SetRegister是我自己写的, 替换掉即可.<br />
&nbsp; &nbsp; //SetRegistry(dir, "Pacgen", null);<br />
}<br />
catch {<br />
&nbsp; &nbsp; //注册失败, 添加开机启动项.<br />
&nbsp; &nbsp; //SetRegistry(dir, "Pacgen", settings.AutoStart ? "\"" + Application.ExecutablePath + "\" background" : null);<br />
}</p></blockquote>
<p>现在程序就能悄无声息地以管理员权限启动了, 连请求用户都免了. 开心.</p>
<p>最后附上官方说明: <a href="http://msdn.microsoft.com/en-us/magazine/cc163350.aspx">http://msdn.microsoft.com/en-us/magazine/cc163350.aspx</a>
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/785">http://www.vilic.info/blog/archives/785</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/785">http://www.vilic.info/blog/archives/785</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/785/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>通过注册表修改系统PAC代理设置</title>
		<link>http://www.vilic.info/blog/archives/780</link>
		<comments>http://www.vilic.info/blog/archives/780#comments</comments>
		<pubDate>Sat, 24 Dec 2011 17:01:29 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[.NET/C#]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=780</guid>
		<description><![CDATA[最近在写一个代理工具的整合, 不过不便发到博客上来, 就说说里面单纯的技术问题, 今天先写这一篇. 修改代理的办法貌似不少, 常用的貌似就注册表和Win API - InternetSetOption, 一开始我当然是想从相对正规的渠道, API来搞定, 花了相当大的力气, 才搜到相关内容, 并且修改成我需要的样子. 不过代码被我删了... 所以... 就不能分享了, 这里直接说说通过注册表改PAC设置的问题. 首先, 为什么我最后要用注册表而不是Win API? 原因是我没找到Win API修改Dial-up和VPN的PAC设置的方法, 所以也是无奈之举. 毕竟很多用户, 比如我自己, 就是通过Dial-up或者VPN联网的. 那, 下面开始主体内容. (我使用的是C#) 1. 注册表位置 CurrentUser, Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections 2. 值 值的名称就是连接的名称, 值是字节数据, 所以需要简单地分析下结构. (后来有个学长提醒说, C++什么的里面处理这种东西特别方便, 一个结构体搞定, 想想貌似是那个道理) 1) 最前面4字节应该是版本号, Win 7下是0x00000046, XP下貌似是3D, 记不清了... 2) 紧接着的4字节是修改次数, 每次修改都应该+1. 3) 接下来的4字节是flags, [...]]]></description>
			<content:encoded><![CDATA[<p>最近在写一个代理工具的整合, 不过不便发到博客上来, 就说说里面单纯的技术问题, 今天先写这一篇.</p>
<p>修改代理的办法貌似不少, 常用的貌似就注册表和Win API - InternetSetOption, 一开始我当然是想从相对正规的渠道, API来搞定, 花了相当大的力气, 才搜到相关内容, 并且修改成我需要的样子. 不过代码被我删了... 所以... 就不能分享了, 这里直接说说通过注册表改PAC设置的问题.</p>
<p>首先, 为什么我最后要用注册表而不是Win API? 原因是我没找到Win API修改Dial-up和VPN的PAC设置的方法, 所以也是无奈之举. 毕竟很多用户, 比如我自己, 就是通过Dial-up或者VPN联网的. 那, 下面开始主体内容. (我使用的是C#)</p>
<p>1. 注册表位置</p>
<p>CurrentUser, Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections</p>
<p>2. 值</p>
<p>值的名称就是连接的名称, 值是字节数据, 所以需要简单地分析下结构. (后来有个学长提醒说, C++什么的里面处理这种东西特别方便, 一个结构体搞定, 想想貌似是那个道理)</p>
<p>1) 最前面4字节应该是版本号, Win 7下是0x00000046, XP下貌似是3D, 记不清了...<br />
2) 紧接着的4字节是修改次数, 每次修改都应该+1.<br />
3) 接下来的4字节是flags, 其实貌似只有第一个字节用到了, 后面三个字节始终都是0, 这里开启PAC, 把这个值设为0x00000005就可以了, 其他开关什么的, 需要的话自己试试吧.<br />
4) 接下来的4字节是保存了一个或多个(http, socks, ftp等)代理服务器及端口的字符串的长度,  当然, 再接下来的这个长度的字节就是这个字符串的数据了.<br />
5) 接下来的4字节是保存了代理的例外服务器的字符串的长度,  再接下来的这个长度的字节也自然就是这个字符串的数据了.<br />
6) 然后我们需要的东西终于来了, PAC文件的字符串长度, 4字节, 和PAC文件的字符串.<br />
7) 因为我只需要在计数器(第5~8字节)上 +1, 并修改PAC文件即可, 所以后面的数据直接拷贝.</p>
<p>C#代码片段如下, 相关变量请自助:</p>
<blockquote class="vlight"><p>var data = key.GetValue(name) as byte[];<br />
var newData = new List&lt;byte&gt;();</p>
<p>var pos = 0;</p>
<p>//skip head, 4 bytes<br />
newData.AddRange(data.Skip(pos).Take(4));<br />
pos += 4;</p>
<p>//modify count<br />
newData.AddRange(BitConverter.GetBytes(BitConverter.ToInt32(data, pos) + 1));<br />
pos += 4;</p>
<p>//config flags<br />
newData.AddRange(BitConverter.GetBytes(configFlags));<br />
pos += 4;</p>
<p>//skip proxy setting<br />
var skipCount = BitConverter.ToInt32(data, pos) + 4;<br />
newData.AddRange(data.Skip(pos).Take(skipCount));<br />
pos += skipCount;</p>
<p>//skip passby setting<br />
skipCount = BitConverter.ToInt32(data, pos) + 4;<br />
newData.AddRange(data.Skip(pos).Take(skipCount));<br />
pos += skipCount;</p>
<p>//now, pac file<br />
skipCount = BitConverter.ToInt32(data, pos) + 4;</p>
<p>var pathByteList = new List&lt;byte&gt;();<br />
foreach (var chr in path) {<br />
&nbsp; &nbsp; var chrBytes = BitConverter.GetBytes(chr);<br />
&nbsp; &nbsp; chrBytes = chrBytes.Take(chrBytes.Length - 1).ToArray();<br />
&nbsp; &nbsp; pathByteList.AddRange(chrBytes);<br />
}<br />
newData.AddRange(BitConverter.GetBytes(pathByteList.Count));<br />
newData.AddRange(pathByteList);<br />
pos += skipCount;</p>
<p>//the rest<br />
newData.AddRange(data.Skip(pos).ToArray());</p>
<p>var chrs = new char[newData.Count];<br />
for (var i = 0; i &lt; newData.Count; i++)<br />
&nbsp; chrs[i] = (char)newData[i];</p>
<p>//set the reg value<br />
key.SetValue(name, newData.ToArray());</p></blockquote>
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/780">http://www.vilic.info/blog/archives/780</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/780">http://www.vilic.info/blog/archives/780</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/780/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>谈前端编程中面向对象和基于事件编程的实践意义</title>
		<link>http://www.vilic.info/blog/archives/774</link>
		<comments>http://www.vilic.info/blog/archives/774#comments</comments>
		<pubDate>Wed, 26 Oct 2011 19:30:46 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[JavaScript/AJAX]]></category>
		<category><![CDATA[Techniques]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[基于事件]]></category>
		<category><![CDATA[面向对象]]></category>
		<category><![CDATA[面向过程]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=774</guid>
		<description><![CDATA[说明下, 本文仅限于我个人的理解与感受, 如果有错误或者不好的地方, 欢迎指正. 可能对于多数前端工程师来说, 面向过程的编程模式依旧是够用的, 其实很多时候, 我自己写的代码也几乎都只是函数没有类. 但面向过程毕竟有它的局限性. 当完成一些庞大的东西, 或者逻辑复杂, 容易产生混乱的代码时, 面向过程的模式就不容易处理了. 当然, 其实说到底, 还是和代码书写者的状况有关系. 我相信, 一个足够优秀的前端工程师, 即使面向过程, 也能写出清晰, 明了, 正确的程序来. 或者说, 在他的这种面向过程的编程下, 已经埋入了很深的面向对象的思想. (另外, 一定要有new才是面向对象吗? 显然不是, 面向对象只是一种思想, 不拘泥于实现的方法.) 面向对象的编程, 很大的一个好处, 就是把程序员从混乱中解放出来, 让思路更清晰, 把注意力集中在一些需要攻克的技术细节, 而非整个系统复杂的内部交互. 当然, 由此带来的东西就更多了, 比如更高的编程效率, 更少的bug. 但, 如何设计一个程序面向对象的结构呢? 这个我想是面向对象的过程中最关键的一步了. 它直接决定了之后具体实现的难易程度, 这应该也是一个高水平的前端工程师需要具备的能力. 接下来举两个例子, 谈谈两种不同的面向对象编程. 1. Web 游戏 Web 游戏的实现过程中, 处理一些具体算法方面的问题, 整体控制也是个问题. 比如说一个简单的操作, [...]]]></description>
			<content:encoded><![CDATA[<p>说明下, 本文仅限于我个人的理解与感受, 如果有错误或者不好的地方, 欢迎指正.</p>
<p>可能对于多数前端工程师来说, 面向过程的编程模式依旧是够用的, 其实很多时候, 我自己写的代码也几乎都只是函数没有类. 但面向过程毕竟有它的局限性. 当完成一些庞大的东西, 或者逻辑复杂, 容易产生混乱的代码时, 面向过程的模式就不容易处理了.</p>
<p>当然, 其实说到底, 还是和代码书写者的状况有关系. 我相信, 一个足够优秀的前端工程师, 即使面向过程, 也能写出清晰, 明了, 正确的程序来. 或者说, 在他的这种面向过程的编程下, 已经埋入了很深的面向对象的思想. (另外, 一定要有new才是面向对象吗? 显然不是, 面向对象只是一种思想, 不拘泥于实现的方法.)</p>
<p>面向对象的编程, 很大的一个好处, 就是把程序员从混乱中解放出来, 让思路更清晰, 把注意力集中在一些需要攻克的技术细节, 而非整个系统复杂的内部交互. 当然, 由此带来的东西就更多了, 比如更高的编程效率, 更少的bug.</p>
<p>但, 如何设计一个程序面向对象的结构呢? 这个我想是面向对象的过程中最关键的一步了. 它直接决定了之后具体实现的难易程度, 这应该也是一个高水平的前端工程师需要具备的能力.</p>
<p>接下来举两个例子, 谈谈两种不同的面向对象编程.</p>
<p><strong>1. Web 游戏</strong></p>
<p>Web 游戏的实现过程中, 处理一些具体算法方面的问题, 整体控制也是个问题. 比如说一个简单的操作, 可能会引起复杂的反应, 这些反应可能是各个方面的, 如画面呈现, 内部变化等等. 当然用面向过程的模式也能解决, 但普通的面向过程或许不那么容易简单地解决. 或者即使解决了, 代码的可读性, 或可维护性或许会不那么好.</p>
<p>这个时候, 用几个对象来分别控制游戏的不同部分, 或者会比较容易实现. 比如, 可以分成score, game, operation, 分别表示游戏的得分, 主体和操作控制, 而game又可以继续细分成foreground, stage, background等等. 这样一来, 思路就顿时清晰了.</p>
<p>这里提到的面向对象, 有一个特点, 就是所有的对象都是单独的实例, 不过很多时候就是这样, 一个类出来就只用一次. 这个时候, 我通常这样写JS:</p>
<blockquote class="vlight"><p>var object = new function () {<br />
&nbsp; &nbsp; this.someMethod = function () { };<br />
} ();</p></blockquote>
<p><strong>2. 多级菜单</strong></p>
<p>作为前端工程师, 这个东西应该多少有接触过. 这个例子有很明显的两个对象, 菜单(包括子菜单)和菜单项目. 用面向对象来实现, 我们就只用关心菜单和菜单项目之间的关系, 只要把这两者的关系思考清楚, 就能很容易地避免一些令人伤心的bug, 或者实现难度问题.</p>
<blockquote class="vlight"><p>function Menu() {<br />
&nbsp; &nbsp; this.add = function (item) { };<br />
}</p>
<p>function Item() {<br />
&nbsp; &nbsp; this.childMenu = null;<br />
}</p></blockquote>
<p>显然, 这里的面向对象, 与之前提到的区别就在于, 我们会用到多个实例, 而且这些实例的数量很多时候是不确定的. 但是只要把握住它们的关系, 就能高效的完成代码, 并且规避一些面向过程容易遇到的bug. 同时, 这种模式可以配合事件编程, 效果更好.</p>
<p>上面提到了面向对象两种看似不同的实践, 但其本质是一样的, 只是一个注重整体的规划, 一个注重功能实现. 配合使用, 我想对整个实现来说, 会有很大的意义. 当然, 或许上面这两个例子还不足以让你感觉到面向对象的优越性, 可能是因为这两个例子还不够复杂, 也没有很大的实现难度. 毕竟合适的才是最好的, 根据需求选择适当的模式, 才是聪明人的选择.</p>
<p>当然, 在实际操作的过程中, 或许并不是那么容易把某些东西抽象出来, 或者可以抽象出来的东西很多, 取舍又是个问题. 这些就需要前端工程师的经验和思考了.</p>
<p>最后再提一下基于事件的编程.</p>
<p>拿一些UI特效为例吧, 比如某个窗口飞入飞出, 我们希望它在飞入的时候做什么, 飞出的时候做什么. 当然随便写写也好, 但可维护性和可扩展性或许就不那么好了. 特别是当这些窗口不止一个两个, 运动也相互独立的时候, 普通的写法就更吃力了. 而且最主要的是, 即使实现了, 也相当容易出bug. 不过最终, 面向对象是核心, 基于事件是翅膀, 没了对象, 事件又能有什么大作为呢?</p>
<p>希望这些想法能对不熟悉或者刚接触面向对象编程的同学有一点参考作用, 也欢迎交流和指正.
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/774">http://www.vilic.info/blog/archives/774</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/774">http://www.vilic.info/blog/archives/774</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/774/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>宇宙无属性 (v3)</title>
		<link>http://www.vilic.info/blog/archives/769</link>
		<comments>http://www.vilic.info/blog/archives/769#comments</comments>
		<pubDate>Thu, 15 Sep 2011 07:15:15 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[Personal Diaries]]></category>
		<category><![CDATA[Science]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=769</guid>
		<description><![CDATA[这是我写的第三篇用于阐述这个观点的文章, 因为这个想法很抽象, 尽管之前已经很努力地去说明, 但似乎依然不容易理解. 昨天先后同两个人解释了这个观点, 其中理解的一位给出了这样的评价 “无懈可击”, 让我激动了好一阵子, 结合这些经验, 我决定再写一篇, 尝试以最容易被接受的方式去解释这个想法. 但我想能理解的仍然会是很少的一部分人. 坦白点说, 要理解这个观点需要较高的IQ. 依然从&#60;Mr. Nobody&#62;这部电影说起. 这部电影是唯心的, 并且强调自由意志, 这方面并不对我胃口, 但也正是其中的一些话, 引发了我的思考. 电影最后, 年轻人问: “You can’t be dead and still be here. You can’t not exist. Is there life after death?” Nemo回答道: “After death, how can you be so sure you even exist? You don’t exist, [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><span style="color: #333333;">这是我写的第三篇用于阐述这个观点的文章, 因为这个想法很抽象, 尽管之前已经很努力地去说明, 但似乎依然不容易理解. 昨天先后同两个人解释了这个观点, 其中理解的一位给出了这样的评价 “无懈可击”, 让我激动了好一阵子, 结合这些经验, 我决定再写一篇, 尝试以最容易被接受的方式去解释这个想法. 但我想能理解的仍然会是很少的一部分人. 坦白点说, 要理解这个观点需要较高的IQ.</span></p></blockquote>
<p>依然从&lt;Mr. Nobody&gt;这部电影说起. 这部电影是唯心的, 并且强调自由意志, 这方面并不对我胃口, 但也正是其中的一些话, 引发了我的思考. 电影最后, 年轻人问: “You can’t be dead and still be here. You can’t not exist. Is there life after death?” Nemo回答道: “After death, how can you be so sure you even exist? You don’t exist, neither do I.”</p>
<p>正是这个对话让我思考, 如果尝试否定自己的存在, 否定世界的存在, 或许能有新的收获? 但对于一个正常人, 这并不容易. 我们觉得, 既然我们能感觉到自己, 感觉到这个世界, 那么这一切就都是真的, 它们存在, 我存在. 然而, 我们如何能判断自己的意识就是真的呢? 更容易让人接受的, 我们现在所想的一切, 都是基于已有的记忆. 于是, 我们又如何能肯定此前的一刻是真实存在过的? 当然, 这篇文章并不是在讨论意识, 上面这些内容也只是小热身, 让大家试着去否定自己的存在, 现在所提及的内容还并不抽象, 也应该很好理解.</p>
<p><strong>那, </strong><strong>正文从这里开始吧.</strong> 下文可能会频繁地用到 “宇宙” 和 “世界” 这两个词语, 请注意区分.</p>
<p>我们存在, 但也无所谓存在. 我们的世界存在, 但也无所谓存在.</p>
<p>任何东西都具有一定的属性, 容易理解的属性很多, 比如颜色, 大小, 形状, 质量, 名称等等. <strong>但还有一些被忽视, </strong><strong>或者不容易被理解的属性, </strong><strong>比如 “</strong><strong>存在还是不存在”, “</strong><strong>真还是假”.</strong> 种种属性构成了这个世界, 也构成了我们对世界的认知.</p>
<p>然而, “包容” 了我们这个世界的 <strong>“</strong><strong>宇宙” </strong><strong>本身或许并不具有任何属性</strong>. 它是极简的.</p>
<p>我给 “包容” 一词加上了引号, 因为它本是不能用在我所说的 “宇宙” 上的. 事实上, 任何对这个 “宇宙” 的描述都是错误的. 但下文为了解释这个观点, 不得不犯这样一些 “错误”. 这个 “宇宙” 什么都不是, 也什么都没有, 也即所谓的 “不具有任何属性”. 自然, 很多人会问, 既然它什么都不是, 什么都没有, 那我们的世界算什么? 我们算什么?</p>
<p><strong>我们的世界是真实存在的, </strong><strong>我们也是真实存在的, </strong><strong>但是 “</strong><strong>包容” </strong><strong>它们的 “</strong><strong>宇宙” </strong><strong>是无所谓存在的.</strong> 或者用我们这个世界的属性来描述, 上面的说法 “接近”, 这个 “宇宙” 是不存在的. 一个 “不存在” 的 “宇宙” 却 “包容” 了无数真实存在的东西, 这就是终极问题的一个答案.</p>
<p>不仅如此, 在这个 “宇宙” 中, “包容” 了无数个世界, 这些世界没有交集, 我们也不可能从其中一个世界到达另一个世界. <strong>在我们的世界, </strong><strong>一切都以 “</strong><strong>存在” </strong><strong>为基础, </strong><strong>但或许在另一个世界, </strong><strong>并非如此.</strong></p>
<p>到这里, 如果能理解的, 应该也有头绪了. 我用一个比喻来帮助理解. 我们的世界就像一个数字, 而 “宇宙” 的 “无属性” 就像一个系数0, 不管数字多大, 乘上0, 结果依旧是0. 这也是为什么我们可以如此真实地存在在这个无所谓存在的 “宇宙” 中.</p>
<p><strong>“</strong><strong>宇宙” </strong><strong>的 “</strong><strong>无属性” </strong><strong>看似否定了一切, </strong><strong>实际却包容了一切.</strong> 如果你理解了, 欢迎告诉我你的想法. 另外如果没有理解, 但是想理解, 也可以和我交流.
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/769">http://www.vilic.info/blog/archives/769</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/769">http://www.vilic.info/blog/archives/769</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/769/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Let&#039;s &quot;call&quot; around!</title>
		<link>http://www.vilic.info/blog/archives/765</link>
		<comments>http://www.vilic.info/blog/archives/765#comments</comments>
		<pubDate>Mon, 12 Sep 2011 17:23:14 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[JavaScript/AJAX]]></category>
		<category><![CDATA[Techniques]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=765</guid>
		<description><![CDATA[记JavaScript的种种神奇. 自己博客更新频率越来越低了, 很大程度上, 是因为技术上的收获不再有那么多, 另外即使有, 也不是特别容易归纳或者表达亦或者常用的技巧, 所以也没必要写到博客上来. 不过, 还是想写一篇, 说说怎么玩JavaScript. 标题是 &#60;Let's "call" around!&#62;, 所以什么是call? 既然玩的是JavaScript, call自然不能少. 当然, 本文包含但不仅限于call, call在这里代表的, 应该是一类东西. 那, 什么时候, 我们会使用call或者apply呢? 做个不完全归纳吧. OOP. 函数劫持. this绑定. OOP 其实这个应该算在this绑定里, 但是在OOP中, 又运用得特别多, 于是单做一类. 假设有一个class, MyClass. 那么创建一个实例 var mc = new MyClass(), 在某些时候, 可以做如下替换. var mc = {}; MyClass.call(mc); 当然, 他们并不是等价的, 而且差距还蛮大. 但有些时候, 从功能上讲, 是可以代替一部分的. 不过在这里, [...]]]></description>
			<content:encoded><![CDATA[<p>记JavaScript的种种神奇.</p>
<p>自己博客更新频率越来越低了, 很大程度上, 是因为技术上的收获不再有那么多, 另外即使有, 也不是特别容易归纳或者表达亦或者常用的技巧, 所以也没必要写到博客上来. 不过, 还是想写一篇, 说说怎么玩JavaScript.</p>
<p>标题是 &lt;Let's "call" around!&gt;, 所以什么是call? 既然玩的是JavaScript, call自然不能少. 当然, 本文包含但不仅限于call, call在这里代表的, 应该是一类东西.</p>
<p>那, 什么时候, 我们会使用call或者apply呢? 做个不完全归纳吧.</p>
<ul>
<li>OOP.</li>
<li>函数劫持.</li>
<li>this绑定.</li>
</ul>
<p><strong>OOP</strong></p>
<p>其实这个应该算在this绑定里, 但是在OOP中, 又运用得特别多, 于是单做一类. 假设有一个class, MyClass. 那么创建一个实例 var mc = new MyClass(), 在某些时候, 可以做如下替换. var mc = {}; MyClass.call(mc); 当然, 他们并不是等价的, 而且差距还蛮大. 但有些时候, 从功能上讲, 是可以代替一部分的. 不过在这里, 由于建立对象和调用构造函数分成了两部分, 我们就可以在其中增加一些trick. 至于什么trick, 就不多做讨论了.</p>
<p><strong>函数劫持</strong></p>
<p>这个时候用apply可能偏多吧, 毕竟能传递几乎所有的参数, 也方便些. 如之前存在函数fn. 现在要劫持它, 那么就可以 var fnBackup = fn; fn = function () { fnBackup.apply(this, arguments); }; 好吧, 这个仍然牵涉到了this...</p>
<p><strong>this绑定</strong></p>
<p>于是, 就说说单纯的this绑定咯. 对于Web前端开发来说, 在事件处理上, 一定会很熟悉. 当然对于我, 就更熟悉啦, 嘎嘎嘎. 因为写到的很多东西里, 我都会通过this绑定一些方法什么的, 供函数使用, 比如VEJIS的类有这样的写法:</p>
<p>var C = static_class_(function () {<br />
&nbsp; &nbsp; this.public_({<br />
&nbsp; &nbsp; &nbsp; &nbsp; xxx: 123<br />
&nbsp; &nbsp; });<br />
&nbsp; &nbsp; this.private_({<br />
&nbsp; &nbsp; &nbsp; &nbsp; yyy: 456<br />
&nbsp; &nbsp; });<br />
});</p>
<p>匿名函数配合this, 很好用!</p>
<p>OK, 说完了call和apply, 说说<strong>callee和caller</strong>. callee大家应该很熟悉, 不过caller就... 其实实话, 我也不是很熟, 但是觉得很有意思. 虽然现在还基本没用到过, 以后就说不定咯. 用法请arguments.callee.caller.caller.caller... 自己试试咯.</p>
<p>然后<strong>关于正则</strong>. 先说match. 在非global情况下, 我习惯这么用.</p>
<p>var result = string.match(regexp) || [];</p>
<p>一个JS里很常见的技巧不是么, 如果我想得到整个匹配的字符串, 那我会这么做. (string.match(regexp) || [''])[0]. 当然, 这个也很简单, 就看有没这个习惯了. 使用这种方式能省不少代码哦.</p>
<p>那说说exec. 这是我最近两年来比较喜欢的方法, 在global模式下非常管用. 我习惯的用法类似:</p>
<p>var groups;<br />
while (groups = regexp.exec(string)) { }</p>
<p>关于<strong>instanceof</strong>. 这个是JS的一个好东西啊, 这个运算符给了JS这种弱类型语言处理强类型工作的能力. 既然说到它, 就不得不说说继承.</p>
<p>JS中如何实现继承? 其他的方法就不在赘述了, 推荐我比较喜欢的一种:</p>
<p>var Class = function () {};<br />
Class.prototype = Base.prototype; //或者Class.prototype = new Base();</p>
<p>var c = new Class();<br />
var o = {};<br />
Base.call(o);<br />
copy(o, c); //这儿就伪代码了, 把o上面的东西拷贝到c上, 根据需要覆盖或不覆盖.</p>
<p>当然... 这样写有点长, 于是, 请自行封装... 使用VEJIS当然也是可以的, 简单多了:</p>
<p>var Class = class(function () { }).inherit_(Base);</p>
<p>这种写法的优势是什么呢? 相对单纯的prototype继承, 它能够更好地保证成员的独立性, 相对单纯的工厂模式, 它能保证instanceof为true. 代价稍大, 但可以忽略.</p>
<p><strong>关于参数的合法性</strong>, 有时候我们的代码是给第三方用的, 同一个方法, 或许我们在内部调用的时候, 需要使用某个参数, 但却不希望第三方使用这个参数, 这个时候怎么办? 有人会说, 约定好就好了. 但显然约定只是自我安慰. 我是一个不喜欢暴露变量的人, 不该暴露的东西绝不暴露, 不该给别人用的东西绝对不能给别人用. 于是推荐的方式是, 在自己可控的闭包内, 创建一个类, 如下:</p>
<p>function Value(value) {<br />
&nbsp; &nbsp; this.value = value;<br />
}</p>
<p>然后再验证参数的时候, 使用instanceof就可以了. 因为Value这个类在闭包内, 只要不传出去 (当然, 也不能把它的实例传出去), 就是安全的.</p>
<p><strong>逻辑运算符的妙用</strong>. 这个场景不多见, 也只能是抛砖引玉. 场景是这样的, 通过XHR请求到一些脚本, 脚本内容是调用了一个函数, 现在我需要通过eval来得到这个函数的返回值. 特殊之处在于, 如果前面有注释怎么办? 用正则清除掉? 可行, 但是不大好吧... 于是前后加括号? 万一结尾有分号呢? 于是, 最后我采取的方法如下: var value = global.eval('(function () { return false || ' + script + ' })()');</p>
<p>困了... 睡觉去.
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/765">http://www.vilic.info/blog/archives/765</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/765">http://www.vilic.info/blog/archives/765</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/765/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>实习回来那么久啦, 也是时候写感想啦</title>
		<link>http://www.vilic.info/blog/archives/749</link>
		<comments>http://www.vilic.info/blog/archives/749#comments</comments>
		<pubDate>Mon, 12 Sep 2011 15:18:28 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[Personal Diaries]]></category>
		<category><![CDATA[一淘]]></category>
		<category><![CDATA[实习]]></category>
		<category><![CDATA[淘宝]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=749</guid>
		<description><![CDATA[中秋哦, 今天是. 7.10, 自己只身离开学校来到杭州, 在淘宝开始为期两个月的实习.  其实严格地说, 我在的地方叫 "一淘". 不久前淘宝分家, 成了三家公司: "淘宝(C2C)", "淘宝商城(B2C)", "一淘(搜索, 入口)". 不过因为刚刚分家不久, 三家公司都还混在一起, 不怎么能感觉到很明显的独立意味. 办理入职后, 由阿大把我和另一位实习生, XP, 领到了办公地点, 然后由师兄师姐帮忙领到了电脑. 这里还要特别感谢下妙净大, 帮我们争取了好久, 终于争取到了22英寸的显示器. 因为虽然UED部门可以使用22英寸显示器, 但实习生一般是不行的. 我和XP都分到一位大大, 做师兄或者师姐, 帮我们熟悉环境和解答一些疑问. 我的师兄是俊毅大. 彻底的好男人啊, 压力很大. 顺便, 丘迟大大好可爱啊. 几天后, 是实习生入职培训, 总共六个小组, 我也不知道怎么的成了我们组组长, 然后组名还盗用了高中时候的一个学习小组组名, 叫 "基因重组", 主要是觉得好霸气, 好高科技! 当然, 组员给力, 组长给力, 结果当然给力! 无悬念地, 我们以第一名的成绩完成了这次 "培训". 按说我们组应该每人能领到一个小公仔, 不过现场失控, 我的小公仔被抢了... 最关键的是, [...]]]></description>
			<content:encoded><![CDATA[<p>中秋哦, 今天是.</p>
<p>7.10, 自己只身离开学校来到杭州, 在淘宝开始为期两个月的实习.  其实严格地说, 我在的地方叫 "一淘". 不久前淘宝分家, 成了三家公司: "淘宝(C2C)", "淘宝商城(B2C)", "一淘(搜索, 入口)". 不过因为刚刚分家不久, 三家公司都还混在一起, 不怎么能感觉到很明显的独立意味.</p>
<p>办理入职后, 由阿大把我和另一位实习生, XP, 领到了办公地点, 然后由师兄师姐帮忙领到了电脑. 这里还要特别感谢下妙净大, 帮我们争取了好久, 终于争取到了22英寸的显示器. 因为虽然UED部门可以使用22英寸显示器, 但实习生一般是不行的.</p>
<p style="text-align: center;"><a href="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02160-2.jpg"><img class="size-full wp-image-750 aligncenter" title="电脑" src="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02160-2.jpg" alt="" width="480" height="360" /></a></p>
<p>我和XP都分到一位大大, 做师兄或者师姐, 帮我们熟悉环境和解答一些疑问. 我的师兄是俊毅大. 彻底的好男人啊, 压力很大. 顺便, <a href="http://yjc.me/">丘迟</a>大大好可爱啊.</p>
<p>几天后, 是实习生入职培训, 总共六个小组, 我也不知道怎么的成了我们组组长, 然后组名还盗用了高中时候的一个学习小组组名, 叫 "基因重组", 主要是觉得好霸气, 好高科技! 当然, 组员给力, 组长给力, 结果当然给力! 无悬念地, 我们以第一名的成绩完成了这次 "培训". 按说我们组应该每人能领到一个小公仔, 不过现场失控, 我的小公仔被抢了... 最关键的是, 是被阿曼抢去给别人了... 下面附照一张, 当然, 最霸气的就是我.</p>
<p style="text-align: center;"><a href="http://www.vilic.info/blog/wp-content/uploads/2011/09/temp.jpg"><img class="size-full wp-image-751 aligncenter" title="基因重组" src="http://www.vilic.info/blog/wp-content/uploads/2011/09/temp.jpg" alt="" width="450" height="340" /></a></p>
<p>培训之后, 又是过了很久, 才慢慢进入工作状态. 因为一开始没分配到什么工作, 所以我还蛮心虚的, 觉得对不起实习津贴. 后来总算慢慢忙起来了, 感觉也不错, 做前端就是那么欢乐.</p>
<p>因为我们中午吃饭的时候, 有时是一种叫 "小餐桌" 的形式, 也就是叫外卖, 点二十来道菜, 然后二十来个人一起吃. 餐桌是大家的柜子 (可以移动) 拼成的, 故得名 "小餐桌". 后来分配到一个任务, 写一个点餐系统, 方便大家点菜... 好吧, 最后的确被我水了... 水的原因有二, 一个是后来慢慢比较忙一些, 一个是当时突然涌现了无数小餐桌点餐系统... 而且确有功能比较完善的, 于是自己再做重复的东西意义也就不大了.</p>
<p>工作上, 是朝九晚六, 中间一小时休息时间. 但实际上时间很灵活, 早上9:30之前到就好, 不打卡, 一切看人品. 不过作为技术宅, 晚上经常会有一群人, 当然包括我, 会待到很晚. 一方面回去也就是对着电脑, 一方面, 还有夜宵吃.</p>
<p style="text-align: center;"><a href="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02290.jpg"><img class="size-full wp-image-752 aligncenter" title="夜宵" src="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02290.jpg" alt="" width="480" height="360" /></a></p>
<p>周末也是, 一般会有很多人来公司蹭网蹭饭, 早上来可以领午餐, 中午来可以领晚餐. 于是... 宅男有什么理由拒绝呢?</p>
<p style="text-align: center;"><a href="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02284.jpg"><img class="size-full wp-image-753 aligncenter" title="周末午晚餐" src="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02284.jpg" alt="" width="480" height="360" /></a></p>
<p>顺便, 科学上网也很方便哦! 说到这个, 欢迎follow <a href="http://twitter.com/vilicvane">@vilicvane</a>(twitter), 圈vilic.vane@gmail.com(G+), 加i@vilic.info(facebook).</p>
<p>那下面说说工作吧. 搞IT的就是搞IT的, 感觉不到阶级的存在, 大家就像同学一样, 然后一起工作, 一起努力, 当然也可能是我们平时也很少接触更高层的上司. 关于这个问题, 我还专门问了天宏大 (应该算一淘UED的主管吧), 他所描述的也是如此. 整个行业相对来说, 都会 "单纯" 一些, 毕竟搞技术的拼的是实力.</p>
<p>我们主要是使用GIT做版本控制, IDE方面, 使用VIM的居多, 另外有看到乔花姐貌似是在用IntelliJ IDEA, 当然, 我肯定是用的VS (确切地说是Visual Web Developer). 不过VS有点不爽, 其实不能说不爽, 只怪它太强. 就是每次都会格式化别人的JS, 弄得我提交之后, GIT会以为我修改了整个文件里的几乎全部代码...</p>
<p>顺便, 我的第一个位置, 座位号是2-2-2, 比较霸气... 不过那是个好位置啊, 左边和前面都是运营, 右前方是视觉和交互, 至于这些意味着什么, 你们懂的... 悲剧就悲剧在虽然本人心灵衰老, 到生理年龄还太小, 只能打望打望而已...</p>
<p style="text-align: center;"><a href="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02161.jpg"><img class="size-full wp-image-754 aligncenter" title="座位号" src="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02161.jpg" alt="" width="480" height="360" /></a></p>
<p>后来搬到了窗户边, 没事可以看看窗外, 也不错的.</p>
<p style="text-align: center;"><a href="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02409.jpg"><img class="size-full wp-image-755 aligncenter" title="窗外" src="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02409.jpg" alt="" width="480" height="360" /></a></p>
<p>工作之余, 大家会经常玩桌上足球. 我的水平也有了质的飞跃啊. 不过可惜没拍下相关照片... 但, 另外一种颓废场景的照片, 我还是拍下来了的...</p>
<p style="text-align: center;"><a href="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02577.jpg"><img class="size-full wp-image-756 aligncenter" title="游戏机" src="http://www.vilic.info/blog/wp-content/uploads/2011/09/DSC02577.jpg" alt="" width="480" height="360" /></a></p>
<p>对了... 中途相机走失, 是在阿大的帮助下找到的, 对此我还欠阿大一顿饭... 有机会补上...</p>
<p>那写在最后, 一淘是个好地方, 人杰地灵, 这次实习, 想要gain到的东西也gain到了. 团队合作经验和工作体验. 顺便, 现在一淘很缺人哦, 大家请疯狂地投简历! 前端请到 ada@taobao.com, 交互和视觉请到 yuecheng@taobao.com.
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/749">http://www.vilic.info/blog/archives/749</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/749">http://www.vilic.info/blog/archives/749</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/749/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>图片展示心得一二</title>
		<link>http://www.vilic.info/blog/archives/740</link>
		<comments>http://www.vilic.info/blog/archives/740#comments</comments>
		<pubDate>Tue, 16 Aug 2011 14:15:55 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[高宽自适应]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=740</guid>
		<description><![CDATA[这两天在做淘吧首页的重构, 有很多地方会有图片的展示. 图片之后会由运营上传, 所以无法硬性规定图片的规格. 于是写代码的时候, 则要加以注意, 防止因为图片的问题破坏了布局. 最开始我的做法很直接, 确定图片大小, 问题则是, 如果图片高宽比不对, 则会变形. 但考虑到运营通常会按照规则传图片, 所以其实也是可行的. 但是妙净大似乎不是很能接受这种做法, 于是给出了这边通用的一个解决方案, 可以实现任意大小图片的垂直居中, 并且过于大的图片也不会破坏布局, 缺点是结构层次太多: &#60;div&#62;&#60;a&#62;&#60;img /&#62;&#60;/a&#62;&#60;/div&#62; 总共三层, 一方面觉得有点累赘, 一方面因为自己都是两层, 图片出现的位置很多, 要改也很麻烦, 后来想出了一个觉得不错的办法. 为了简洁, 我就直接把style写到HTML里了: &#60;a href="#" style="display: block; width: 120px; height: 100px; overflow: hidden;"&#62; &#60;img alt="vilic" src="vilic.png" style="display: block; margin: auto; height: 100px;" /&#62; &#60;/a&#62; 这段代码也很好理解, 将内外元素display: block; (当然, 对于外面的元素, [...]]]></description>
			<content:encoded><![CDATA[<p>这两天在做淘吧首页的重构, 有很多地方会有图片的展示. 图片之后会由运营上传, 所以无法硬性规定图片的规格. 于是写代码的时候, 则要加以注意, 防止因为图片的问题破坏了布局.</p>
<p>最开始我的做法很直接, 确定图片大小, 问题则是, 如果图片高宽比不对, 则会变形. 但考虑到运营通常会按照规则传图片, 所以其实也是可行的.</p>
<p>但是妙净大似乎不是很能接受这种做法, 于是给出了这边通用的一个解决方案, 可以实现任意大小图片的垂直居中, 并且过于大的图片也不会破坏布局, 缺点是结构层次太多:</p>
<p>&lt;div&gt;&lt;a&gt;&lt;img /&gt;&lt;/a&gt;&lt;/div&gt;</p>
<p>总共三层, 一方面觉得有点累赘, 一方面因为自己都是两层, 图片出现的位置很多, 要改也很麻烦, 后来想出了一个觉得不错的办法. 为了简洁, 我就直接把style写到HTML里了:</p>
<blockquote class="vlight"><p>&lt;a href="#" style="display: block; width: 120px; height: 100px; overflow: hidden;"&gt;<br />
&lt;img alt="vilic" src="vilic.png" style="display: block; margin: auto; height: 100px;" /&gt;<br />
&lt;/a&gt;</p></blockquote>
<p>这段代码也很好理解, 将内外元素display: block; (当然, 对于外面的元素, 使用float, 或者是position: absolute;也是可以的), 外面的元素定高宽, 且overflow: hidden; 保证图片不会在过大的时候超出. 而对于img, 变为块级元素后, 使用margin: auto; 则可以在图片较小, 或者高宽比较大时水平居中. 而height: 100px; 与a元素等高, 宽度不定, 这样一方面可以限制图片的高度, 一方面使图片不至于变形.</p>
<p>所以总体来说, 这个方案除了在图片高宽比较小时, 显示会左对齐(即图片右边可能会被挡住), 其他时候, 都能比较完美地展现图片, 重要的是, 兼容性很好, 结构简单.</p>
<p>试一下吧~</p>
<p><strong>补充下, 后来想到, 如果说把容器宽度设置得足够宽, 然后再调节margin或者其他东西, 让超出部分隐藏, 那么, 即可实现较宽的图片也能居中了.</strong>
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/740">http://www.vilic.info/blog/archives/740</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/740">http://www.vilic.info/blog/archives/740</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/740/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>JavaScript 推荐书写规范</title>
		<link>http://www.vilic.info/blog/archives/726</link>
		<comments>http://www.vilic.info/blog/archives/726#comments</comments>
		<pubDate>Mon, 01 Aug 2011 06:15:41 +0000</pubDate>
		<dc:creator>VILIC</dc:creator>
				<category><![CDATA[JavaScript/AJAX]]></category>
		<category><![CDATA[Techniques]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[书写规范]]></category>

		<guid isPermaLink="false">http://www.vilic.info/blog/?p=726</guid>
		<description><![CDATA[自己写JavaScript也有一些年头了, 前些时候看Douglas的JSLint和他推荐的写法, 深有感触, 也见过不少JSer使用了他的规范, 但, 很多地方, 我却不能认同. 当然, 写法什么的, 最终还是看个人, 哪种写法效率更高, 就用哪种. 下面我就对比Douglas的规范, 说说我推荐的写法. JavaScript文件及引用 根据需要将JavaScript代码放入单独的*.js文件中, 这些需要一般可能是指: 代码量较大, 代码被多个页面重用, 为了方便维护等. &#60;script&#62;标签因尽量放在&#60;head&#62;中, 并且标注type="text/javascript". 对于普通网页, 放在&#60;body&#62;结束之后, 有需要时甚至是&#60;body&#62;之中也是可以接受的. 但对于JavaScript密集的网页及WebApp, 应尽量避免. 缩进 空格和Tab都可以接受, 但最好不要混用. 换行 代码书写时要尽量保证其可读性, 自然每一行不应该过于长, 但不推荐无语义的换行. 换行应该能表达一个逻辑片段, 分组等意义. 注释及空行 根据代码的需要进行注释, 在一个代码片段开始的前一行使用 // 注释该片段的作用, 对于难以理解的单行代码, 使用 // 注释在该行代码之后. 对于一个完整的, 或者相对重要的功能块, 使用 /* */ 在其上方第二行进行注释, 上方第一行留空. 如果结尾不明显, 容易与之后的代码混淆, 也可以在该功能块结束后再使用 [...]]]></description>
			<content:encoded><![CDATA[<p>自己写JavaScript也有一些年头了, 前些时候看Douglas的JSLint和他推荐的写法, 深有感触, 也见过不少JSer使用了他的规范, 但, 很多地方, 我却不能认同. 当然, 写法什么的, 最终还是看个人, 哪种写法效率更高, 就用哪种. 下面我就对比Douglas的规范, 说说我推荐的写法.</p>
<ol>
<li><strong>JavaScript文件及引用</strong><br />
根据需要将JavaScript代码放入单独的*.js文件中, 这些需要一般可能是指: 代码量较大, 代码被多个页面重用, 为了方便维护等. &lt;script&gt;标签因尽量放在&lt;head&gt;中, 并且标注type="text/javascript". 对于普通网页, 放在&lt;body&gt;结束之后, 有需要时甚至是&lt;body&gt;之中也是可以接受的. 但对于JavaScript密集的网页及WebApp, 应尽量避免.</li>
<li><strong>缩进</strong><br />
空格和Tab都可以接受, 但最好不要混用.</li>
<li><strong>换行</strong><br />
代码书写时要尽量保证其可读性, 自然每一行不应该过于长, 但不推荐无语义的换行. 换行应该能表达一个逻辑片段, 分组等意义.</li>
<li><strong>注释及空行</strong><br />
根据代码的需要进行注释, 在一个代码片段开始的前一行使用 // 注释该片段的作用, 对于难以理解的单行代码, 使用 // 注释在该行代码之后. 对于一个完整的, 或者相对重要的功能块, 使用 /* */ 在其上方第二行进行注释, 上方第一行留空. 如果结尾不明显, 容易与之后的代码混淆, 也可以在该功能块结束后再使用 /* */ 进行注释. 对于容易理解的代码, 也应该根据功能或者逻辑进行分组, 中间用空行隔开.</li>
<li><strong>变量的声明和定义</strong><br />
声明所有变量, 不过类似于 global.abc = 123; (浏览器中为window)这样的语句也是可以接受的. 随时声明变量能够帮助避免很多作用域的问题, 反之, 类似的问题可能会成为极大的困扰. 从个人来讲, 即使你非常清楚变量的作用域, 也应声明变量, 或者使用类似于global.abc = 123; 这样的形式定义全局变量. 当然, 语义化是永远需要注意的, 这点也适用于下面的函数声明.<br />
根据逻辑的进行声明变量, 有些变量, 比如在一个闭包中会被多个逻辑使用, 或者从意义上应该是独立与其他逻辑的, 应该放在闭包的最上方, 而部分仅仅会在某个逻辑中使用的变量, 则应该在该逻辑开始, 且该变量使用前声明. 如果该逻辑需要的变量较多, 容易与其他变量冲突, 可以考虑将该逻辑放入一个闭包中. 需要注意的是, 有些语句或许并不适合包含声明变量的代码, 比如if.<br />
另外, 不推荐使用一个var语句声明大量变量, 将变量分组, 并按意义上的先后顺序进行排序或许更好. 如:</p>
<blockquote class="vlight"><p>
var id;<br />
var width, height;<br />
var left, top;
</p></blockquote>
<p>当需要在声明的同时定义变量时, 通常我的做法是一个var语句只对应一个变量. 同时, 避免使用不必要的全局变量, 但不要担心局部变量和全局变量或闭包中的变量重名, 如果我们已经很清楚各自作用域的范围, 为了避免重名而给变量名添加各种前后缀, 或者缩写变量名的做法, 只会使代码变得更难理解.</li>
<li><strong> 函数声明和定义</strong><br />
一般使用function语句进行函数声明, 且声明应放在当前闭包的最下方. 一般情况下, 一个函数主要是处理一个逻辑中某一个从意义上简单, 但代码量较大或者重用率较高的功能. 如果将函数声明在前面, 反而会影响我们直观地获知逻辑结构, 让本末倒置. 另一方面, 如果函数名足够语义化, 对于多数功能, 我们甚至可以略过函数体, 直接通过函数名来完成逻辑的阅读.<br />
对于声明和定义, 推荐使用这样的格式, 注意哪些地方有空格:</p>
<blockquote class="vlight"><p>
/* 普通声明 */<br />
function abc() {<br />
&nbsp; &nbsp; //代码<br />
}<br />
/* 匿名函数赋值 */<br />
var fn1 = function () { return true; }; //单个语句可以写成一行<br />
var fn2 = function () {<br />
&nbsp; &nbsp; if (true)<br />
&nbsp; &nbsp; &nbsp; &nbsp; return true;<br />
&nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; return false;<br />
};
</p></blockquote>
<p>另外, 只有一些非常通用的函数适合作为全局函数(除非当前项目的JavaScript代码量非常少). 其他时候, 需要根据逻辑和意义来确定函数声明的位置. 闭包是JavaScript最美好的东西之一, 一定要善于利用. 它能够让代码具有更明显的结构. 有时需要建立一个立即执行的函数来实现一个闭包, 推荐这样的写法:</p>
<blockquote class="vlight"><p>
(function () {<br />
&nbsp; &nbsp; //代码<br />
})();
</p></blockquote>
</li>
<li><strong>命名</strong><br />
尽量使用字母(A~Z, a~z)数字(0~9)和下划线(_)命名变量. 一般情况使用类似于myFirstName这样的驼峰状命名规则, 但如果变量的值代表一个类, 则首字母应该大写, 如: MyClass.  一些由于实现必须要求出现在逻辑结构之外的变量, 建议在其前后加双下划线标注. 如:</p>
<blockquote class="vlight"><p>
var __inc__ = 0;<br />
function inc() { __inc__++; }
</p></blockquote>
<p>但多数情况下(当结构相对简单时), 可以使用闭包来避免.<br />
对于一些有特别意义的全局变量, 比如当一个全局变量能决定是否执行某一个功能块, 以及部分常量, 推荐使用全大写命名, 单词之间使用下划线隔开, 如OPEN_DEBUG.<br />
另外, 尽量使用英文命名变量, 即使你的英文不够好. 退一万步, 如果使用拼音, 不要过度缩写. 顺便中英文混合虽然可以让人看到很 "快乐", 但还是不要这样的好 .</li>
<li><strong>语句</strong><br />
每一行最多只包含一个语句, 需要分号的地方一定要加上分号. 包括这样的 语句: var fn = function () {}; 因为这实际上是一个赋值语句.<br />
对于控制结构, 如果只有一条语句, 可以将大括号去掉.<br />
另外, return是一个特定的语句, 并不是一个函数, 所以一般情况下, 不要在return之后使用(). 当然, 有时你可能会需要()帮你排除换行的歧义. 类似的还有typeof.<br />
continue有时会很有用, 所以完全没有必要回避. 至于with, 我很少用.</li>
<li><strong>空格</strong><br />
合理使用空格能够提高代码的可读性, 具体需要使用的情况如下:<br />
控制结构中的标示与()之间, ()与后面的语句或者复合语句之间. 如: while (true) {}.<br />
多数运算符左右应添加空格, 如 var a = 1 + 2; var b = true ? 1 : 0;<br />
逗号(,), 分号(;)后如果不换行则需要添加一个空格.</li>
<li><strong>其他建议</strong><br />
使用 {} 代替 new Object(), [] 代替 new Array();<br />
在创建一个类型的实例时, 不管构造函数的实参个数是否为0, 都应该加上(), 如new Object()不应写为new Object.<br />
如果你已经足够熟悉JavaScript了, 那么使用这样的语句也未尝不可:</p>
<blockquote class="vlight"><p>
var a = true;<br />
if (a = !a)<br />
&nbsp; &nbsp; alert('hello');
</p></blockquote>
<p>同时, ==和!=在多数情况下都是适用的, 所以没必要处处都使用===和!==.<br />
除此之外, 我觉得一个漂亮的JavaScript代码一定是充分并正确利用了JavaScript语言特性的, 至于这些特性, 就很难一一描述了. 不过, 如果你真的喜欢JavaScript, 请去感受它.
</li>
</ol>
<p>所以只是个人建议而已, 具体怎么落实, 酌情.
<p style="font-size: 10px;">Original link of this archive: <a href="http://www.vilic.info/blog/archives/726">http://www.vilic.info/blog/archives/726</a><br />本文的原始链接: <a href="http://www.vilic.info/blog/archives/726">http://www.vilic.info/blog/archives/726</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vilic.info/blog/archives/726/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

