<?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>外刊IT评论 &#187; 浏览器</title>
	<atom:link href="http://www.aqee.net/tag/%e6%b5%8f%e8%a7%88%e5%99%a8/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aqee.net</link>
	<description>国外IT评论,编程技巧,网站开发趋势</description>
	<lastBuildDate>Wed, 08 Sep 2010 16:21:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>【外刊IT评论】Google Chrome浏览器的Web开发扩展工具</title>
		<link>http://www.aqee.net/2010/06/12/chrome-extensions-for-web-development/</link>
		<comments>http://www.aqee.net/2010/06/12/chrome-extensions-for-web-development/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 16:02:02 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[google]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=322</guid>
		<description><![CDATA[
©  外刊IT评论, 2010. &#124;
永久链接：Google Chrome浏览器的Web开发扩展工具 &#124;
One comment &#124;
Add to
del.icio.us

Post tags: chrome, 浏览器

Google Chrome浏览器开发人员工具集给 开发人员在Chrome浏览器里调试HTML，JavaScript和CSS提供了很大的方便。   当编写一个web页时，或者是在给Chrome  Web Store开发一个web应用时，你可以使用这些工具直接在当前页面观察页面上的DOM元素，调试运行时JavaScript，编辑 CSS样式。  这些扩展工具提供了许多额外的功能，让你可以更容易的跟你的浏览器打交道，使得Google Chrome成为了一个很优秀的Web开发环境。   为了指导像你这样的开发人员，我们制作了一个页面来展示这些web开发相关 扩展工具。  我们希望它们能在开发Web应用程序和网站时给您带来帮助。

举个例子，速 度跟踪器是一个能帮助你定位和解决web应用性能问题的扩展工具。     通过使用速度跟踪器，你可以很清楚的了解到你的应用的运行时间都花费在什么上了，究竟是花在JavaScript分析和执行上了，还是花在了CSS样式表 的加载上了，等等。

另外一个很有用的扩展工具是分 辨率测试工具， 它能够改变浏览器窗口的大小，这样开发人员可以按各种屏幕分辨率模式来预览自己的网站。 它提供了一个常用的分辨率列表，但你也可以设置你自定义分辨率数据。

访问Web 开发人员 扩展工具页面，你可以找到更多的开发工具，例如validation  options，页面调整大小工具，CSS元素观察器；如果你安装了它们，这些扩展工具你都可以在工具栏的新增的按钮里找到。

另外一个你需要关注的扩展工具是Chrome 编辑器， 它允许你直接在浏览器里修改代码，你不必在浏览器和代码编辑器之间来回切换了。  当然你也可以用它把代码保存的本地供以后使用。
这些介绍的只是Chrome扩展库里的一部分，你可以在我们的web开发扩展工具页面找 到全部扩展工具。你也可以访问扩展工具展示页面找 到更多的信息。
来自 Koh Kim,  Google [...]]]></description>
			<content:encoded><![CDATA[<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
永久链接：<a href="http://www.aqee.net/2010/06/12/chrome-extensions-for-web-development/">Google Chrome浏览器的Web开发扩展工具</a> |
<a href="http://www.aqee.net/2010/06/12/chrome-extensions-for-web-development/#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/06/12/chrome-extensions-for-web-development/&title=Google Chrome浏览器的Web开发扩展工具">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/chrome/" rel="tag">chrome</a>, <a href="http://www.aqee.net/tag/%e6%b5%8f%e8%a7%88%e5%99%a8/" rel="tag">浏览器</a><br/>
</small></p>
<hr /><p><a href="http://www.chromium.org/devtools">Google Chrome浏览器开发人员工具集</a>给 开发人员在Chrome浏览器里调试HTML，JavaScript和CSS提供了很大的方便。   当编写一个web页时，或者是在给<a href="https://chrome.google.com/webstore">Chrome  Web Store</a>开发一个web应用时，你可以使用这些工具直接在当前页面观察页面上的DOM元素，调试运行时JavaScript，编辑 CSS样式。  这些扩展工具提供了许多额外的功能，让你可以更容易的跟你的浏览器打交道，使得Google Chrome成为了一个很优秀的Web开发环境。   为了指导像你这样的开发人员，我们制作了一个页面来<a href="https://chrome.google.com/extensions/featured/web_dev">展示这些web开发相关 扩展工具</a>。  我们希望它们能在开发Web应用程序和网站时给您带来帮助。<span id="more-322"></span><!--more--></p>
<div style="text-align: center;"><img id="BLOGGER_PHOTO_ID_5475384639119240162" src="http://www.aqee.net/wordpress/wp-content/uploads/2010/06/index.001.png" alt="" /></div>
<p>举个例子，<a href="https://chrome.google.com/extensions/detail/ognampngfcbddbfemdapefohjiobgbdl">速 度跟踪器</a>是一个能帮助你定位和解决web应用性能问题的扩展工具。     通过使用速度跟踪器，你可以很清楚的了解到你的应用的运行时间都花费在什么上了，究竟是花在JavaScript分析和执行上了，还是花在了CSS样式表 的加载上了，等等。</p>
<div style="text-align: center;"><img id="BLOGGER_PHOTO_ID_5475384645114221506" src="http://www.aqee.net/wordpress/wp-content/uploads/2010/06/index.002.png" alt="" /></div>
<p>另外一个很有用的扩展工具是<a href="https://chrome.google.com/extensions/detail/idhfcdbheobinplaamokffboaccidbal">分 辨率测试工具</a>， 它能够改变浏览器窗口的大小，这样开发人员可以按各种屏幕分辨率模式来预览自己的网站。 它提供了一个常用的分辨率列表，但你也可以设置你自定义分辨率数据。</p>
<div style="text-align: center;"><img id="BLOGGER_PHOTO_ID_5475384651246473362" src="http://www.aqee.net/wordpress/wp-content/uploads/2010/06/index.003.png" alt="" /></div>
<p>访问<a href="https://chrome.google.com/extensions/detail/bfbameneiokkgbdmiekhjnmfkcnldhhm">Web 开发人员</a> 扩展工具页面，你可以找到更多的开发工具，例如validation  options，页面调整大小工具，CSS元素观察器；如果你安装了它们，这些扩展工具你都可以在工具栏的新增的按钮里找到。</p>
<div style="text-align: center;"><img id="BLOGGER_PHOTO_ID_5475384654015260738" src="http://www.aqee.net/wordpress/wp-content/uploads/2010/06/index.004.png" alt="" /></div>
<p>另外一个你需要关注的扩展工具是<a href="https://chrome.google.com/extensions/detail/nglgdmkkiemejlladcdjegcllaieegoe">Chrome 编辑器</a>， 它允许你直接在浏览器里修改代码，你不必在浏览器和代码编辑器之间来回切换了。  当然你也可以用它把代码保存的本地供以后使用。</p>
<p>这些介绍的只是Chrome扩展库里的一部分，你可以在我们的<a href="https://chrome.google.com/extensions/featured/web_dev">web开发扩展工具页面</a>找 到全部扩展工具。你也可以访问扩展工具<a href="https://chrome.google.com/extensions/">展示页面</a>找 到更多的信息。</p>
<p><span style="font-style: italic;">来自 Koh Kim,  Google    Chrome 团队</span></p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
永久链接：<a href="http://www.aqee.net/2010/06/12/chrome-extensions-for-web-development/">Google Chrome浏览器的Web开发扩展工具</a> |
<a href="http://www.aqee.net/2010/06/12/chrome-extensions-for-web-development/#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/06/12/chrome-extensions-for-web-development/&title=Google Chrome浏览器的Web开发扩展工具">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/chrome/" rel="tag">chrome</a>, <a href="http://www.aqee.net/tag/%e6%b5%8f%e8%a7%88%e5%99%a8/" rel="tag">浏览器</a><br/>
</small></p>
<hr />]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/06/12/chrome-extensions-for-web-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】早该知道的7个JavaScript技巧</title>
		<link>http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/</link>
		<comments>http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/#comments</comments>
		<pubDate>Thu, 06 May 2010 15:14:04 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[心得体会]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=226</guid>
		<description><![CDATA[
©  外刊IT评论, 2010. &#124;
永久链接：早该知道的7个JavaScript技巧 &#124;
No comment &#124;
Add to
del.icio.us

Post tags: javascript, JSON, 浏览器


我写JavaScript代码已经很久了，都记不起是什么年代开始的了。对于JavaScript这种语言近几年所取得的成就，我感到非常的兴奋；我很幸运也是这些成就的获益者。我写了不少的文章，章节，还有一本专门讨论它的书，然而，我现在依然能发现一些关于这种语言的新知识。下面的描述的就是过去让我不由得发出“啊！”的感叹的编程技巧，这些技巧你应该现在就试试，而不是等着未来的某个时候偶然的发现它们。
简洁写法
JavaScript里我最喜欢的一种东西就是生成对象和数组的简写方法。
在过去，如果你想创建一个对象，你需要这样：






1
var car = new Object();








2
car.colour = 'red';








3
car.wheels = 4;








4
car.hubcaps = 'spinning';








5
car.age = 4;






下面的写法能够达到同样的效果：






1
var car = {








2
 colour:'red',








3
 wheels:4,








4
 hubcaps:'spinning',








5
 age:4








6
}






简单多了，你不需要反复使用这个对象的名称。
这样 car 就定义好了，也许你会遇到 invalidUserInSession 的问题，这只有你在使用IE时会碰到，只要记住一点，不要右大括号前面写分号，你就不会有麻烦。
另外一个十分方便的简写是针对数组的。
传统的定义数组的方法是这样：






1
var moviesThatNeedBetterWriters
= new Array(








2
 'Transformers','Transformers2','Avatar','Indiana
Jones 4'








3
);






简写版的是这样：






1
var moviesThatNeedBetterWriters
= [








2
 'Transformers','Transformers2','Avatar','Indiana
Jones 4'








3
];






对于数组，这里有个问题，其实没有什么图组功能。但你会经常发现有人这样定义上面的 car ，就像这样






1
var car = new Array();








2
car['colour'] = 'red';








3
car['wheels'] = 4;








4
car['hubcaps'] [...]]]></description>
			<content:encoded><![CDATA[<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
永久链接：<a href="http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/">早该知道的7个JavaScript技巧</a> |
<a href="http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/&title=早该知道的7个JavaScript技巧">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/javascript/" rel="tag">javascript</a>, <a href="http://www.aqee.net/tag/json/" rel="tag">JSON</a>, <a href="http://www.aqee.net/tag/%e6%b5%8f%e8%a7%88%e5%99%a8/" rel="tag">浏览器</a><br/>
</small></p>
<hr /><div class="entry inner">
<p>我写JavaScript代码已经很久了，都记不起是什么年代开始的了。对于JavaScript这种语言近几年所取得的成就，我感到非常的兴奋；我很幸运也是这些成就的获益者。我写了不少的文章，章节，还有一本专门讨论它的书，然而，我现在依然能发现一些关于这种语言的新知识。下面的描述的就是过去让我不由得发出“啊！”的感叹的编程技巧，这些技巧你应该现在就试试，而不是等着未来的某个时候偶然的发现它们。<span id="more-226"></span></p>
<h3>简洁写法</h3>
<p>JavaScript里我最喜欢的一种东西就是生成对象和数组的简写方法。<br />
在过去，如果你想创建一个对象，你需要这样：</p>
<div id="highlighter_650872" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">car = </code><code class="jscript keyword">new</code> <code class="jscript plain">Object();</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="jscript plain">car.colour = </code><code class="jscript string">'red'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="jscript plain">car.wheels = 4;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="jscript plain">car.hubcaps = </code><code class="jscript string">'spinning'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="jscript plain">car.age = 4;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>下面的写法能够达到同样的效果：</p>
<div id="highlighter_229039" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">car = {</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">colour:</code><code class="jscript string">'red'</code><code class="jscript plain">,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">wheels:4,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">hubcaps:</code><code class="jscript string">'spinning'</code><code class="jscript plain">,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">age:4</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>简单多了，你不需要反复使用这个对象的名称。<br />
这样 <code>car</code> 就定义好了，也许你会遇到 <code>invalidUserInSession</code> 的问题，这只有你在使用IE时会碰到，只要记住一点，不要右大括号前面写分号，你就不会有麻烦。</p>
<p>另外一个十分方便的简写是针对数组的。<br />
传统的定义数组的方法是这样：</p>
<div id="highlighter_846811" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">moviesThatNeedBetterWriters<br />
= </code><code class="jscript keyword">new</code> <code class="jscript  plain">Array(</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line  alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">'Transformers'</code><code class="jscript plain">,</code><code class="jscript string">'Transformers2'</code><code class="jscript  plain">,</code><code class="jscript string">'Avatar'</code><code class="jscript plain">,</code><code class="jscript string">'Indiana<br />
Jones 4'</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="jscript plain">);</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>简写版的是这样：</p>
<div id="highlighter_149417" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">moviesThatNeedBetterWriters<br />
= [</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">'Transformers'</code><code class="jscript plain">,</code><code class="jscript string">'Transformers2'</code><code class="jscript plain">,</code><code class="jscript string">'Avatar'</code><code class="jscript plain">,</code><code class="jscript string">'Indiana<br />
Jones 4'</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="jscript plain">];</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>对于数组，这里有个问题，其实没有什么图组功能。但你会经常发现有人这样定义上面的 <code>car</code> ，就像这样</p>
<div id="highlighter_884701" class="syntaxhighlighter   jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">car = </code><code class="jscript keyword">new</code> <code class="jscript plain">Array();</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="jscript plain">car[</code><code class="jscript string">'colour'</code><code class="jscript plain">] = </code><code class="jscript string">'red'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="jscript plain">car[</code><code class="jscript string">'wheels'</code><code class="jscript plain">] = 4;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="jscript plain">car[</code><code class="jscript string">'hubcaps'</code><code class="jscript plain">] = </code><code class="jscript string">'spinning'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="jscript plain">car[</code><code class="jscript string">'age'</code><code class="jscript plain">] = 4;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>数组不是万能的；这样写不对，会让人困惑。图组实际上是对象的功能，人们混淆了这两个概念。</p>
<p>另外一个非常酷的简写方法是使用与三元条件符号。<br />
你不必写成下面的样子…</p>
<div id="highlighter_105445" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">direction;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="jscript keyword">if</code><code class="jscript plain">(x &lt; 200){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">direction = 1;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="jscript plain">} </code><code class="jscript keyword">else</code> <code class="jscript plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">direction = -1;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>…<br />
你可以使用三元条件符号简化它：</p>
<div id="highlighter_712726" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">direction<br />
= x &lt; 200 ? 1 : -1;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>当条件为<code>true</code> 时取问号后面的值，否则取冒号后面的值。</p>
<h3>用 JSON 形式存储数据</h3>
<p>在我发现JSON之前，我使用各种疯狂的方法把数据存贮在JavaScript固有的数据类型里面，例如：数组，字符串，中间夹杂着容易进行拆分的标志符号以及其它的令人讨厌的东西。<br />
Douglas Crockford 发明了<a href="http://json.org/">JSON</a> 之后，一切全变了。<br />
使用JSON，你可以使用JavaScript自有功能把数据存贮成复杂的格式，而且不需要再做其它的额外转换，直接可以访问使用。</p>
<p>JSON 是 &#8220;JavaScript Object Notation&#8221; 的缩写，它用到了上面提到的两种简写方法。</p>
<p>于是，如果你想描述一个乐队，你可能会像这样写：</p>
<div id="highlighter_267172" class="syntaxhighlighter   jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">band = {</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"name"</code><code class="jscript plain">:</code><code class="jscript string">"The Red Hot Chili Peppers"</code><code class="jscript plain">,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"members"</code><code class="jscript plain">:[</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"name"</code><code class="jscript plain">:</code><code class="jscript string">"Anthony Kiedis"</code><code class="jscript  plain">,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"role"</code><code class="jscript plain">:</code><code class="jscript string">"lead vocals"</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">},</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"name"</code><code class="jscript plain">:</code><code class="jscript string">"Michael 'Flea' Balzary"</code><code class="jscript plain">,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"role"</code><code class="jscript plain">:</code><code class="jscript string">"bass guitar, trumpet, backing vocals"</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">},</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>12</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>13</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"name"</code><code class="jscript plain">:</code><code class="jscript string">"Chad Smith"</code><code class="jscript plain">,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>14</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"role"</code><code class="jscript plain">:</code><code class="jscript string">"drums,percussion"</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>15</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">},</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>16</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>17</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"name"</code><code class="jscript plain">:</code><code class="jscript string">"John Frusciante"</code><code class="jscript  plain">,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>18</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"role"</code><code class="jscript plain">:</code><code class="jscript string">"Lead Guitar"</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>19</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>20</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">],</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>21</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript string">"year"</code><code class="jscript plain">:</code><code class="jscript string">"2009"</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>22</code></td>
<td class="content"><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>你可以在JavaScript里直接使用JSON，可以把它封装在函数里，甚至作为一个API的返回值形式。<br />
我们把这称作 JSON-P ，很多的API都使用这种形式。<br />
你可以调用一个数据提供源，在script代码里直接返回 JSON-P 数据：</p>
<div id="highlighter_311731" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="jscript plain">&lt;div id=</code><code class="jscript string">"delicious"</code><code class="jscript plain">&gt;&lt;/div&gt;&lt;script&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="jscript keyword">function</code> <code class="jscript plain">delicious(o){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">out = </code><code class="jscript string">'&lt;ul&gt;'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">for</code><code class="jscript plain">(</code><code class="jscript keyword">var</code> <code class="jscript plain">i=0;i&lt;o.length;i++){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">out += </code><code class="jscript string">'&lt;li&gt;&lt;a<br />
href="'</code> <code class="jscript plain">+ o[i].u + </code><code class="jscript string">'"&gt;'</code> <code class="jscript plain">+</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">o[i].d + </code><code class="jscript string">'&lt;/a&gt;&lt;/li&gt;'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">out += </code><code class="jscript string">'&lt;/ul&gt;'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">document.getElementById(</code><code class="jscript string">'delicious'</code><code class="jscript plain">).innerHTML<br />
= out;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="jscript plain">&lt;/script&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>12</code></td>
<td class="content"><code class="jscript plain">&lt;script src=</code><code class="jscript string">"<a href="http://feeds.delicious.com/v2/json/codepo8/javascript?count=15&amp;callback=delicious">http://feeds.delicious.com/v2/json/codepo8/javascript?count=15&amp;callback=delicious</a>"</code><code class="jscript plain">&gt;&lt;/script&gt;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>这是调用 Delicious 网站提供的 Web service 功能，获得JSON格式的最近的无序书签列表。</p>
<p>基本上，JSON是最轻便的描述复杂数据结构的方法，而且它能在浏览器里运行。<br />
你甚至可以在PHP里用 <code>json_decode()</code> 函数来运行它。</p>
<h3>JavaScript的自带函数(Math, Array 和 String)</h3>
<p>让我感到惊奇的一个事情是，当我研究了JavaScript里的math和String函数后，发现它们能极大的简化我的编程劳动。<br />
使用它们，你可以省去复杂的循环处理和条件判断。<br />
例如，当我需要实现一个功能，找出数字数组里最大的一个数时，我过去是这样写出这个循环的，就像下面：</p>
<div id="highlighter_431287" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">numbers =<br />
[3,342,23,22,124];</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">max = 0;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="jscript keyword">for</code><code class="jscript plain">(</code><code class="jscript keyword">var</code> <code class="jscript plain">i=0;i&lt;numbers.length;i++){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">if</code><code class="jscript plain">(numbers[i]<br />
&gt; max){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript  plain">max = numbers[i];</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>7</code></td>
<td class="content"><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>8</code></td>
<td class="content"><code class="jscript plain">alert(max);</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>我们不用循环也能实现：</p>
<div id="highlighter_148781" class="syntaxhighlighter   jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">numbers =<br />
[3,342,23,22,124];</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="jscript plain">numbers.sort(</code><code class="jscript keyword">function</code><code class="jscript plain">(a,b){</code><code class="jscript keyword">return</code> <code class="jscript plain">b -<br />
a});</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="jscript plain">alert(numbers[0]);</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>需要注意的是，你不能对一个数字字符数组进行 <code>sort()</code> ，因为这种情况下它只会按照字母顺序进行排序。<br />
如果你想知道更多的用法，可以阅读 <a href="http://www.javascriptkit.com/javatutors/arraysort.shtml">这篇不错的关于 <code>sort()</code> 的文章。</a></p>
<p>再有一个有意思的函数就是 <code>Math.max()</code>。<br />
这个函数返回参数里的数字里最大的一个数字：</p>
<div id="highlighter_203260" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript plain">Math.max(12,123,3,2,433,4); </code><code class="jscript comments">// returns 433</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>因为这个函数能够校验数字，并返回其中最大的一个，所以你可以用它来测试浏览器对某个特性的支持情况：</p>
<div id="highlighter_763271" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">scrollTop=<br />
Math.max(</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">doc.documentElement.scrollTop,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript  plain">doc.body.scrollTop</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="jscript plain">);</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>这个是用来解决IE问题的。你可以获得当前页面的 <code>scrollTop</code> 值，但是根据页面上 <code>DOCTYPE</code> 的不同，上面这两个属性中只有一个会存放这个值，而另外一个属性会是 <code>undefined</code>，所以你可以通过使用 <code>Math.max()</code> 得到这个数。<br />
阅读<a href="http://www.wait-till-i.com/2007/06/28/shortening-javascripts-with-math/">这篇文章</a>你会得到更多的关于使用数学函数来简化JavaScript的知识。</p>
<p>另外有一对非常有用的操作字符串的函数是 <code>split()</code> 和 <code>join()</code>。我想最有代表性的例子应该是，写一个功能，用来给页面元素附加CSS样式。</p>
<p>是这样的，当你给页面元素附加一个CSS class时，要么它是这个元素的第一个CSS class，或者是它已经有了一些class<br />
, 需要在已有的class后加上一个空格，然后追加上这个class。而当你要去掉这个class时，你也需要去掉这个class前面的空格(这个在过去非常重要，因为有些老的浏览器不认识后面跟着空格的class)。</p>
<p>于是，原始的写法会是这样：</p>
<div id="highlighter_303007" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">function</code> <code class="jscript plain">addclass(elm,newclass){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">c =<br />
elm.className;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line  alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">elm.className = (c === </code><code class="jscript  string">''</code><code class="jscript plain">) ? newclass : c+</code><code class="jscript string">' '</code><code class="jscript plain">+newclass;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>你可以使用 <code>split()</code> 和 <code>join()</code> 函数自动完成这个任务：</p>
<div id="highlighter_169940" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">function</code> <code class="jscript plain">addclass(elm,newclass){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">classes =<br />
elm.className.split(</code><code class="jscript string">' '</code><code class="jscript plain">);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">classes.push(newclass);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">elm.className = classes.join(</code><code class="jscript string">' '</code><code class="jscript plain">);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>这会确保所有的class都被空格分隔，而且你要追加的class正好放在最后。</p>
<h3>事件委派</h3>
<p>Web应用都是由事件驱动运转的。我喜欢事件处理，尤其喜欢自己定义事件。<br />
它能使你的产品可扩展，而不用改动核心代码。<br />
有一个很大的问题（也可以说是功能强大的表现），是关于页面上事件的移除问题。你可以对某个元素安装一个事件监听器，事件监听器就开始运转工作。<br />
但页面上没有任何指示说明这有个监听器。因为这种不可表现的问题 (这尤其让一些新手头疼) ，以及像IE6这样的”浏览器“在太多的使用事件监听时会出现各种的内存问题，你不得不承认尽量少使用事件编程是个明智的做法。</p>
<p>于是 <a href="http://icant.co.uk/sandbox/eventdelegation/"> 事件委托</a> 就出现了。<br />
当页面上某个元素上的事件触发时，而在 DOM 继承关系上，这个元素的所有子元素也能接收到这个事件，这时你可以使用一个在父元素上的事件处理器来处理，而不是使用一堆的各个子元素上的事件监听器来处理。</p>
<p>究竟是什么意思？这样说吧，页面上有很多超链接，你不想直接使用这些链接，想通过一个函数来调用这个链接，<br />
HTML代码是这样的：</p>
<div id="highlighter_218905" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript plain">&lt;h2&gt;Great Web resources&lt;/h2&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="jscript plain">&lt;ul id=</code><code class="jscript string">"resources"</code><code class="jscript plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">&lt;li&gt;&lt;a href=</code><code class="jscript  string">"<a href="http://opera.com/wsc">http://opera.com/wsc</a>"</code><code class="jscript plain">&gt;Opera Web Standards<br />
Curriculum&lt;/a&gt;&lt;/li&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">&lt;li&gt;&lt;a href=</code><code class="jscript  string">"<a href="http://sitepoint.com/">http://sitepoint.com</a>"</code><code class="jscript plain">&gt;Sitepoint&lt;/a&gt;&lt;/li&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">&lt;li&gt;&lt;a href=</code><code class="jscript  string">"<a href="http://alistapart.com/">http://alistapart.com</a>"</code><code class="jscript plain">&gt;A List Apart&lt;/a&gt;&lt;/li&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">&lt;li&gt;&lt;a href=</code><code class="jscript  string">"<a href="http://yuiblog.com/">http://yuiblog.com</a>"</code><code class="jscript plain">&gt;YUI Blog&lt;/a&gt;&lt;/li&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>7</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">&lt;li&gt;&lt;a href=</code><code class="jscript  string">"<a href="http://blameitonthevoices.com/">http://blameitonthevoices.com</a>"</code><code class="jscript plain">&gt;Blame it on the voices&lt;/a&gt;&lt;/li&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>8</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">&lt;li&gt;&lt;a href=</code><code class="jscript  string">"<a href="http://oddlyspecific.com/">http://oddlyspecific.com</a>"</code><code class="jscript plain">&gt;Oddly specific&lt;/a&gt;&lt;/li&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>9</code></td>
<td class="content"><code class="jscript plain">&lt;/ul&gt;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>常见的做法是通过循环这些链接，将每个链接上附加一个事件处理器：</p>
<div id="highlighter_671684" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="jscript comments">// 典型的事件处理例子</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="jscript plain">(</code><code class="jscript keyword">function</code><code class="jscript plain">(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">resources<br />
= document.getElementById(</code><code class="jscript string">'resources'</code><code class="jscript plain">);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">links =<br />
resources.getElementsByTagName(</code><code class="jscript string">'a'</code><code class="jscript plain">);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">all =<br />
links.length;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line  alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">for</code><code class="jscript plain">(</code><code class="jscript keyword">var</code> <code class="jscript plain">i=0;i&lt;all;i++){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// Attach a listener to each link</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">links[i].addEventListener(</code><code class="jscript string">'click'</code><code class="jscript plain">,handler,</code><code class="jscript keyword">false</code><code class="jscript plain">);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">};</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">function</code> <code class="jscript plain">handler(e){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">x =<br />
e.target; </code><code class="jscript comments">// Get the link that was<br />
clicked</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>12</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript  plain">alert(x);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line  alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>13</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">e.preventDefault();</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>14</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">};</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>15</code></td>
<td class="content"><code class="jscript plain">})();</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>我们用一个事件处理器也能完成这项任务：</p>
<div id="highlighter_863706" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="jscript plain">(</code><code class="jscript keyword">function</code><code class="jscript plain">(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">resources<br />
= document.getElementById(</code><code class="jscript string">'resources'</code><code class="jscript plain">);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">resources.addEventListener(</code><code class="jscript string">'click'</code><code class="jscript plain">,handler,</code><code class="jscript keyword">false</code><code class="jscript plain">);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">function</code> <code class="jscript plain">handler(e){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">x =<br />
e.target; </code><code class="jscript comments">// get the link tha</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">if</code><code class="jscript plain">(x.nodeName.toLowerCase()<br />
=== </code><code class="jscript string">'a'</code><code class="jscript  plain">){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">alert(</code><code class="jscript string">'Event<br />
delegation:'</code> <code class="jscript plain">+ x);</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">e.preventDefault();</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">};</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="jscript plain">})();</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>因为点击事件就发生在这些页面元素里，你要做的就是比较它们的 <code>nodeName</code>，找出应该回应这个事件的那个元素。</p>
<p>免责声明：上面说的这两个关于事件的例子，在所有浏览器里都能运行，除了IE6，在IE6上你需要使用一个事件模型，而不是简单的W3C的标准实现。这也就是我们推荐使用一些工具包的原因。</p>
<p>这种方法的好处并不是仅限于把多个事件处理器缩减为一个。你想想，举个例子，你需要动态的往这个链接表里追加更多的链接。使用事件委托后，你就不需要做其它修改了；否则的话，你需要重新循环这个链接表，重新给每个链接安装事件处理器。</p>
<h3>匿名函数和模块化</h3>
<p>在JavaScript里最令人懊恼的事情是变量没有使用范围。任何变量，函数，数组，对象，只要不在函数内部，都被认为是全局的，这就是说，这个页面上的其它脚本也可以访问它，而且可以覆盖重写它。</p>
<p>解决办法是，把你的变量放在一个匿名函数内部，定义完之后立即调用它。<br />
例如，下面的写法将会产生三个全局变量和两个全局函数：</p>
<div id="highlighter_362593" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">name = </code><code class="jscript string">'Chris'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">age = </code><code class="jscript string">'34'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">status = </code><code class="jscript string">'single'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="jscript keyword">function</code> <code class="jscript plain">createMember(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>7</code></td>
<td class="content"><code class="jscript keyword">function</code> <code class="jscript plain">getMemberDetails(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>8</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>9</code></td>
<td class="content"><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>如果这个页面上的其它脚本里也存在一个叫 <code>status</code> 的变量，麻烦就会出现。<br />
如果我们把它们封装在一个 <code>myApplication</code> 里，<br />
这个问题就迎刃而解了：</p>
<div id="highlighter_2290" class="syntaxhighlighter   jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">myApplication<br />
= </code><code class="jscript keyword">function</code><code class="jscript plain">(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">name = </code><code class="jscript string">'Chris'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">age = </code><code class="jscript string">'34'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">status = </code><code class="jscript string">'single'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">function</code> <code class="jscript plain">createMember(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">function</code> <code class="jscript plain">getMemberDetails(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="jscript plain">}();</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>但是，这样一来，在函数外面就没有什么功能了。如果这是你需要的，那就可以了。你还可以省去函数的名称：</p>
<div id="highlighter_639246" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="jscript plain">(</code><code class="jscript keyword">function</code><code class="jscript plain">(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">name = </code><code class="jscript string">'Chris'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">age = </code><code class="jscript string">'34'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">status = </code><code class="jscript string">'single'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">function</code> <code class="jscript plain">createMember(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">function</code> <code class="jscript plain">getMemberDetails(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="jscript plain">})();</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>如果你想在函数外面也能使用里面的东西，那就要做些修改。<br />
为了能访问 <code>createMember()</code> 或 <code>getMemberDetails()</code>,<br />
你需要把它们变成 <code>myApplication</code>的属性，从而把它们暴露于外部的世界:</p>
<div id="highlighter_510392" class="syntaxhighlighter  jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">myApplication<br />
= </code><code class="jscript keyword">function</code><code class="jscript plain">(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">name = </code><code class="jscript string">'Chris'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">age = </code><code class="jscript string">'34'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">status = </code><code class="jscript string">'single'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">return</code><code class="jscript plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">createMember:</code><code class="jscript keyword">function</code><code class="jscript plain">(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">},</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">getMemberDetails:</code><code class="jscript  keyword">function</code><code class="jscript plain">(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>12</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>13</code></td>
<td class="content"><code class="jscript plain">}();</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>14</code></td>
<td class="content"><code class="jscript comments">//<br />
myApplication.createMember() 和</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>15</code></td>
<td class="content"><code class="jscript comments">//<br />
myApplication.getMemberDetails() 就可以使用了。</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>这被称作 module 模式或 singleton。<br />
Douglas Crockford 多次谈到过这些，<a href="http://developer.yahoo.com/yui">Yahoo User Interface Library YUI</a> 里对此有大量的使用。<br />
但这样一来让我感到不便的是，我需要改变句式来使函数和变量能被外界访问。更甚者，调用时我还需要加上<code>myApplication</code> 这个前缀。所以，我不喜欢这样做，我更愿意简单的把需要能被外界访问的元素的指针导出来。这样做后，反倒简化了外界调用的写法：</p>
<div id="highlighter_887978" class="syntaxhighlighter   jscript">
<div class="lines">
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">myApplication<br />
= </code><code class="jscript keyword">function</code><code class="jscript plain">(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">name = </code><code class="jscript string">'Chris'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">age = </code><code class="jscript string">'34'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">var</code> <code class="jscript plain">status = </code><code class="jscript string">'single'</code><code class="jscript plain">;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">function</code> <code class="jscript plain">createMember(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">function</code> <code class="jscript plain">getMemberDetails(){</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript comments">// [...]</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript keyword">return</code><code class="jscript plain">{</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>12</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">create:createMember,</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>13</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">get:getMemberDetails</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>14</code></td>
<td class="content"><code class="spaces"> </code><code class="jscript plain">}</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1">
<table border="0">
<tbody>
<tr>
<td class="number"><code>15</code></td>
<td class="content"><code class="jscript plain">}();</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2">
<table border="0">
<tbody>
<tr>
<td class="number"><code>16</code></td>
<td class="content"><code class="jscript comments">//现在写成 myApplication.get()<br />
和 myApplication.create() 就行了。</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>我把这个称作 &#8220;<a href="http://www.wait-till-i.com/2007/08/22/again-with-the-module-pattern-reveal-something-to-the-world/">revealing<br />
module pattern</a>.&#8221;</p>
<h3>可配置化</h3>
<p>一旦我把所写的JavaScript代码发布到这个世界上，就有人想改动它，通常是人们想让它完成一些它本身完成不了的任务—但通常也是我写的程序不够灵活，没有提供用户可自定义的功能。</p>
<p>解决办法是给你的脚本增加一个配置项对象。<br />
我 <a href="http://www.wait-till-i.com/2008/05/23/script-configuration/">曾经写过一篇深入介绍JavaScript配置项对象的文章</a>，下面是其中的要点：</p>
<ul>
<li>在你的脚本了添加一个叫做 <code>configuration</code> 的对象。</li>
<li>这个对象里面，存放所有人们在使用这个脚本时经常要改动的东西：
<ul>
<li>CSS ID 和类名称;</li>
<li>按钮的名称，标签字等;</li>
<li>诸如&#8221;每页显示图片数”的值， &#8220;图像的显示的尺寸&#8221;的值;</li>
<li>地点，位置，以及语言设置。</li>
</ul>
</li>
<li>将这个对象作为一个公用属性返回给用户，这样用户可以修改覆盖它。</li>
</ul>
<p>通常情况下这是你编程过程中的最后一步要做的事情。我把这些集中表现在了一个例子里： &#8220;<a href="http://www.wait-till-i.com/2008/02/07/five-things-to-do-to-a-script-before-handing-it-over-to-the-next-developer/">Five<br />
things to do to a script before handing it over to the next developer</a>.&#8221;</p>
<p>实际上，你也希望你的代码能够让人们很方面的使用，并且根据他们各自的需要进行一些改动。<br />
如果你实现了这个功能，你会少收到一些抱怨你的脚本的人发送给你的让你困惑的邮件，这些信件会告诉你，有人修改了你的脚本，而且很好用。</p>
<h3>与后台交互</h3>
<p>在这么多年的编程经历中，我所领悟到的一个重要的事情就是，JavaScript是一个很优秀的开发界面交互的语言，但如果用来处理数字或访问数据源，那就有点使不上劲了。</p>
<p>最初，我学习JavaScript，是用来替代Perl的，因为我很讨厌非要把代码拷贝到 <code>cgi-bin</code> 文件夹下才能使Perl运行。<br />
后来，我明白了应该使用一种后台工作的语言来处理主要的数据，而不能什么事情都让JavaScript去做。更重要的是我们要考虑安全性和语言特征。</p>
<p>如果我访问一个Web service, 我可以获取到JSON-P 格式的数据，在客户端浏览器里我把它做各种各样的数据转换，<br />
但当我有了服务器时，我有了更多的方法来转换数据，我可以在Server端生成JSON或HTML格式的数据返回给客户端，以及缓存数据等操作。<br />
如果你事先了解了并准备了这些，你会长期收益，省去了很多头疼的时间。</p>
<h3>编写适用各种浏览器的程序是种浪费时间，使用工具包吧！</h3>
<p>在我最初开始搞Web开发时，在访问页面时，究竟是使用 <code>document.all</code> 还是使用 <code>document.layers</code> 的问题上痛苦的挣扎了很久。<br />
我选择了 <code>document.layers</code>，因为我喜欢任何层都是自己的document的思想 (而且我写了太多的 <code>document.write</code> 来生成元素)。<br />
层模式最终失败了，于是我开始使用 <code>document.all</code>。<br />
当Netscape 6 公布只支持 W3C DOM 模型时，我很高兴，但其实用户并不关心这些。<br />
用户只是看见这种浏览器不能显示大多数浏览器都能正常显示的东西—这是我们编码的问题。<br />
我们编写了短视的代码，只能运行在当前的环境下，而不幸的是，我们的运行环境却在不停的改变。</p>
<p>我已经浪费了太多的时间来处理对各种浏览器各种版本兼容的问题。<br />
善于处理这类问题提供了我一个好的工作机会。但现在我们不必在忍受这种痛苦了。</p>
<p>一些工具包，例如 YUI, jQuery 以及<br />
Dojo 都能够帮我们处理这类问题。<br />
它们通过抽象各种接口实现来处理浏览器的各种问题，像版本不兼容，设计缺陷等，把我们从痛苦中解救出来。<br />
除非你要测试某个Beta版的浏览器，千万不要在自己的程序里添加修正浏览器的缺陷的代码，<br />
因为你很有可能当浏览器已经修改了这个问题时，你却忘了删除你的代码。</p>
<p>另一方面，完全依赖于工具包也是个短视的行为。工具包可以帮你快速的开发，但如果你不深入理解JavaScript，你也会做错事。</p>
<p><em>(al)</em></div>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
永久链接：<a href="http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/">早该知道的7个JavaScript技巧</a> |
<a href="http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/&title=早该知道的7个JavaScript技巧">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/javascript/" rel="tag">javascript</a>, <a href="http://www.aqee.net/tag/json/" rel="tag">JSON</a>, <a href="http://www.aqee.net/tag/%e6%b5%8f%e8%a7%88%e5%99%a8/" rel="tag">浏览器</a><br/>
</small></p>
<hr />]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/05/06/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】介绍几款优秀的手机浏览器</title>
		<link>http://www.aqee.net/2009/11/11/a-list-of-mobile-web-browsers/</link>
		<comments>http://www.aqee.net/2009/11/11/a-list-of-mobile-web-browsers/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 15:26:39 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[手机]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=75</guid>
		<description><![CDATA[
©  外刊IT评论, 2009. &#124;
永久链接：介绍几款优秀的手机浏览器 &#124;
No comment &#124;
Add to
del.icio.us

Post tags: 手机, 浏览器


手机浏览器之间存在很大的差别，主要是因为它们对各种手机操作系统的支持有别，提供的各种功能也有很大差异。 最好的浏览器可以正常的浏览大部分的网站，提供页面缩放和键盘快捷键功能,而其它的一些只能浏览针对移动设备优化过的网站。
同时,很多手机并没有提供你多少选择浏览器的能力,但现在的很多新手机使用了像windows mobile之类的操作系统,它已经内置了好几种浏览器. 如果你的手机是使用symbian s60,那你还可以选择安装自己喜的浏览器.

Opera Mobile


主要特征： 多标签页, 自由缩放。
操作系统： Windows Mobile, Symbian
价格： 免费




Opera Mini


主要特征： 内容压缩传输, 自由缩放。
操作系统：Java
价格： 免费



Skyfire


主要特征： 可以显示多媒体网页,例如flash和 youtube视频,可自定义缩放功能.
操作系统： Windows Mobile, Symbian
价格： 免费



Safari


主要特征：可以显示多媒体网页,例如flash和 youtube视频, 可自定义缩放功能, 优秀的触摸功能界面
操作系统：iPhone
价格： iPhone 上免费



Mozilla&#8217;s Minimo

主要特征： 多标签页，社交书签。
操作系统： Windows Mobile
价格： 免费 (开源)



Google Android

主要特征：多媒体显示, 缩放功能,触摸屏界面
操作系统：Google Android
价格： Android 上免费



Bitstream&#8217;s Thunderhawk

主要特征：内容压缩传输, 自由缩放
操作系统： Symbian S60, Windows Mobile, [...]]]></description>
			<content:encoded><![CDATA[<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2009. |
永久链接：<a href="http://www.aqee.net/2009/11/11/a-list-of-mobile-web-browsers/">介绍几款优秀的手机浏览器</a> |
<a href="http://www.aqee.net/2009/11/11/a-list-of-mobile-web-browsers/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2009/11/11/a-list-of-mobile-web-browsers/&title=介绍几款优秀的手机浏览器">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/%e6%89%8b%e6%9c%ba/" rel="tag">手机</a>, <a href="http://www.aqee.net/tag/%e6%b5%8f%e8%a7%88%e5%99%a8/" rel="tag">浏览器</a><br/>
</small></p>
<hr /><div id="intro">
<p>手机浏览器之间存在很大的差别，主要是因为它们对各种手机操作系统的支持有别，提供的各种功能也有很大差异。 最好的浏览器可以正常的浏览大部分的网站，提供页面缩放和键盘快捷键功能,而其它的一些只能浏览针对移动设备优化过的网站。</p>
<p>同时,很多手机并没有提供你多少选择浏览器的能力,但现在的很多新手机使用了像windows mobile之类的操作系统,它已经内置了好几种浏览器. 如果你的手机是使用symbian s60,那你还可以选择安装自己喜的浏览器.</p></div>
<div>
<h2><a href="http://www.opera.com/products/mobile/" target="_blank">Opera Mobile</a></h2>
<p><img class="alignnone size-full wp-image-79" title="2610-opera-mobile-browser" src="http://www.aqee.net/wordpress/wp-content/uploads/2009/11/2610-opera-mobile-browser.jpg" alt="2610-opera-mobile-browser" width="450" height="168" /></p>
<ul>
<li><strong>主要特征：</strong> 多标签页, 自由缩放。</li>
<li><strong>操作系统：</strong> Windows Mobile, Symbian</li>
<li><strong>价格：</strong> 免费</li>
</ul>
</div>
<p><span id="more-75"></span></p>
<div>
<h2><a href="http://www.operamini.com/" target="_blank">Opera Mini</a></h2>
<p><img class="alignnone size-full wp-image-81" title="www_operachina_com_mini_next" src="http://www.aqee.net/wordpress/wp-content/uploads/2009/11/www_operachina_com_mini_next.png" alt="www_operachina_com_mini_next" width="455" height="222" /></p>
<ul>
<li><strong>主要特征：</strong> 内容压缩传输, 自由缩放。</li>
<li><strong>操作系统：</strong>Java</li>
<li><strong>价格：</strong> 免费</li>
</ul>
</div>
<div>
<h2><a href="http://www.skyfire.com/" target="_blank">Skyfire</a></h2>
<p><img class="alignnone size-full wp-image-83" title="Skyfire" src="http://www.aqee.net/wordpress/wp-content/uploads/2009/11/FireShot-Pro-capture-006-Skyfire-I-Free-Mobile-Media-Browser-for-Windows-I-Symbian-Browser-I-Mobile-Video-Player-www_skyfire_com_product.png" alt="Skyfire" width="538" height="226" /></p>
<ul>
<li><strong>主要特征：</strong> 可以显示多媒体网页,例如flash和 youtube视频,可自定义缩放功能.</li>
<li><strong>操作系统：</strong> Windows Mobile, Symbian</li>
<li><strong>价格：</strong> 免费</li>
</ul>
</div>
<div>
<h2><a href="http://www.apple.com/iphone/features/safari.html" target="_blank">Safari</a></h2>
<p><img class="alignnone size-full wp-image-85" title="www_apple_com_iphone_iphone-3gs_safari_html" src="http://www.aqee.net/wordpress/wp-content/uploads/2009/11/www_apple_com_iphone_iphone-3gs_safari_html.png" alt="www_apple_com_iphone_iphone-3gs_safari_html" width="485" height="247" /></p>
<ul>
<li><strong>主要特征：</strong>可以显示多媒体网页,例如flash和 youtube视频, 可自定义缩放功能, 优秀的触摸功能界面</li>
<li><strong>操作系统：</strong>iPhone</li>
<li><strong>价格：</strong> iPhone 上免费</li>
</ul>
</div>
<div>
<h2><a href="http://www.mozilla.org/projects/minimo/" target="_blank">Mozilla&#8217;s Minimo</a></h2>
<ul>
<li><strong>主要特征：</strong> 多标签页，社交书签。</li>
<li><strong>操作系统：</strong> Windows Mobile</li>
<li><strong>价格：</strong> 免费 (开源)</li>
</ul>
</div>
<div>
<h2><a href="http://code.google.com/android/what-is-android.html" target="_blank">Google Android</a></h2>
<ul>
<li><strong>主要特征：</strong>多媒体显示, 缩放功能,触摸屏界面</li>
<li><strong>操作系统：</strong>Google Android</li>
<li><strong>价格：</strong> Android 上免费</li>
</ul>
</div>
<div>
<h2><a href="http://www.bitstream.com/wireless/" target="_blank">Bitstream&#8217;s Thunderhawk</a></h2>
<ul>
<li><strong>主要特征：</strong>内容压缩传输, 自由缩放</li>
<li><strong>操作系统：</strong> Symbian S60, Windows Mobile, Java</li>
<li><strong>价格：</strong>$49.95/year or $5.95/month</li>
</ul>
</div>
<div>
<h2><a href="http://www.microsoft.com/windowsmobile/software/iemobile.mspx" target="_blank">Microsoft IE for Mobile</a></h2>
<ul>
<li><strong>主要特征：</strong>标准浏览器</li>
<li><strong>操作系统：</strong>Windows Mobile</li>
<li><strong>价格：</strong> Free with Windows Mobile</li>
</ul>
</div>
<div>
<h2><a href="http://en.wikipedia.org/wiki/Blazer_%28web_browser%29" target="_blank">Blazer</a></h2>
<ul>
<li><strong>主要特征：</strong>标准浏览器</li>
<li><strong>操作系统：</strong>Palm OS</li>
<li><strong>价格：</strong>Free with Palm OS</li>
</ul>
</div>
<div>
<h2><a href="http://en.wikipedia.org/wiki/Web_Browser_for_S60" target="_blank">S60 Web Browser</a></h2>
<ul>
<li><strong>主要特征：</strong>标准浏览器</li>
<li><strong>操作系统：</strong> S60</li>
<li><strong>价格：</strong> Free with S60</li>
</ul>
</div>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2009. |
永久链接：<a href="http://www.aqee.net/2009/11/11/a-list-of-mobile-web-browsers/">介绍几款优秀的手机浏览器</a> |
<a href="http://www.aqee.net/2009/11/11/a-list-of-mobile-web-browsers/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2009/11/11/a-list-of-mobile-web-browsers/&title=介绍几款优秀的手机浏览器">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/%e6%89%8b%e6%9c%ba/" rel="tag">手机</a>, <a href="http://www.aqee.net/tag/%e6%b5%8f%e8%a7%88%e5%99%a8/" rel="tag">浏览器</a><br/>
</small></p>
<hr />]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2009/11/11/a-list-of-mobile-web-browsers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
