<?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>Neeke &#187; JavaScript</title>
	<atom:link href="http://www.ineeke.com/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ineeke.com</link>
	<description>(function f(a){if(a == &#039;堕落&#039;){return f(&#039;上进&#039;);}else{alert( &#039;保持&#039;+a+&#039;！加油！！！&#039;);}})(&#039;上进&#039;)</description>
	<lastBuildDate>Tue, 07 Sep 2010 11:23:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>JavaScript回车切换焦点</title>
		<link>http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/</link>
		<comments>http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 06:56:42 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/</guid>
		<description><![CDATA[一般情况下，在一个form表单中如果存在一个input标签的type值为submit，那么直接敲回车键这个表单就提交了。且，一般情况下，网页中切换焦点都是使用Tab键来控制，顺序则由标签的index属性值来控制。]]></description>
			<content:encoded><![CDATA[<p>一般情况下，在一个form表单中如果存在一个input标签的type值为submit，那么直接敲回车键这个表单就提交了。且，一般情况下，网页中切换焦点都是使用Tab键来控制，顺序则由标签的index属性值来控制。<br />
不过，为了使用者的方便（并不一定方便，而是客户的需求，客户觉得Tab不方便。），我们需要用JavaScript来重新实现一番，要能够通过回车切换焦点而不提交表单。<br />
可以这么来实现：每个input都赋予唯一id值，且id是有规律有次序的（如共有n个，则id值依次为：i1,i2,i3&#8230;in）。首先获取所有的input标签：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> inputs <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>接下来遍历并处理onkeyup事件，回车键的ASCⅡ码值为13，当keyCode值为13时，使用JavaScript正则表达式取出当前当input标签中id索引值，从而拼出下一个待获得焦点的input标签的id，接着使用document.getElementById()找到该标签并调用自身的focus()方法使其获得焦点。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> inputs.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	inputs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">onkeyup</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		event <span style="color: #339933;">=</span> event <span style="color: #339933;">||</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>event.<span style="color: #660066;">keyCode</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">13</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #003366; font-weight: bold;">var</span> next <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'i'</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>parseInt<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\d+/</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>next<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				next.<span style="color: #000066;">focus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>但是这时候点击回车表单依旧会提交。可以这么处理：将submit改成button，然后监听onclick通过JavaScript提交表单。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li><li>2010年04月6日 -- <a href="http://www.ineeke.com/archives/variables-as-properties/" title="JavaScript变量与对象属性">JavaScript变量与对象属性</a><br /><small>你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Java模拟腾讯微博的网页登录失败</title>
		<link>http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/</link>
		<comments>http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 13:43:10 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[Java技术]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/</guid>
		<description><![CDATA[想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，记录下来，等有空了继续折腾。]]></description>
			<content:encoded><![CDATA[<p>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，记录下来，等有空了继续折腾。<br />
腾讯微博登录页面在这里：http://ui.ptlogin2.qq.com/login_weibo.html<br />
<span style="color: #ff0000;">已成功，可以选择继续阅读，或查看[<a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-success/" target="_blank">Java模拟腾讯微博的网页登录成功</a>]</span>。<br />
通过分析得到如下信息：<br />
主要JS文件：</p>
<blockquote><p>http://ui.ptlogin2.qq.com/login_t.js</p></blockquote>
<p>验证码获取地址：</p>
<blockquote><p>http://ptlogin2.qq.com/check?uin=9920317&#038;appid=46000101&#038;r=0.2535580481721431</p></blockquote>
<p>在登录页载入的时候这个请求被发送，这个返回的是一个JavaScript，类似这么个格式：</p>
<blockquote><p>ptui_checkVC(&#8217;0&#8242;,&#8217;!Y2D&#8217;)</p></blockquote>
<p>在页面上通过eval()执行，将第二个参数（验证码）赋给表单的隐藏域。<br />
登录时的请求：</p>
<blockquote><p>http://ptlogin2.qq.com/login?u=9920317&#038;p=33FB075FEFD31C2BBD38E3D1CD71491D&#038;verifycode=!Y2D&#038;aid=46000101&#038;u1=http://t.qq.com&#038;h=1&#038;from_ui=1&#038;fp=loginerroralert</p></blockquote>
<p>通过测试发现登录时的参数p的值（MD5加密后的密码）每次都不一样，刚开始有点纳闷，假设数据库里面存的是33FB075FEFD31C2BBD38E3D1CD71491D，而我登录的时候发送的是33FB075FEFD31C2BBD38E3D1CD71491A或者33FB075FEFD31C2BBD38E3D1CD71491E，他这是怎么判断密码是否一致的？后来分析了login_t.js，其实腾讯的这个登录与之前我做过的[<a href="http://www.ineeke.com/archives/alipay-interface-development/" target="_blank">支付宝接口开发</a>]和[<a href="http://www.ineeke.com/archives/alipay-interface-development-coldfusion-edition/" target="_blank">支付宝接口开发（ColdFusion版）</a>]是同一个道理。<br />
从login_t.js中可以找到如下代码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> f <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
f <span style="color: #339933;">+=</span> e.<span style="color: #660066;">verifycode</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
f <span style="color: #339933;">=</span> f.<span style="color: #660066;">toUpperCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
b <span style="color: #339933;">+=</span> md5<span style="color: #009900;">&#40;</span>md5_3<span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">p</span>.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> f<span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>先将输入的原始密码A通过md5_3()加密得到字符串B，接着将验证码追加到B之后得到C，再用md5()加密C得到D。原始密码当然是不变的，而验证码每次都不一样（当然也有几率一样），这就是为什么每次发送的MD5值都不一样的原因了。<br />
从登录的请求中可以找到verifycode这个参数，打眼一看就知道是验证码啦，从客户端将上面得到的D与verifycode都发送到服务器端，服务器端通过u值（QQ号）查出上面的密码B，然后在服务器端对B+verifycode进行md5求值，将结果与发送过来的D进行比较，一致则登录成功，反之失败。（这些都是结合支付宝那个猜的）<br />
其它参数基本上都是死值，除了获取验证码时传递的那个随机数r。<br />
都分析清楚了，我就用Java开工了，写了下面这么个类（因为是瞎捣鼓，所以没考虑什么规范）：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> QQ <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> md5<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> p<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> hex_md5<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> md5_3<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> p<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">int</span> s<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	    s <span style="color: #339933;">=</span> core_md5<span style="color: #009900;">&#40;</span>str2binl<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span>, p.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    s <span style="color: #339933;">=</span> core_md5<span style="color: #009900;">&#40;</span>s, <span style="color: #cc66cc;">16</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    s <span style="color: #339933;">=</span> core_md5<span style="color: #009900;">&#40;</span>s, <span style="color: #cc66cc;">16</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> binl2hex<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> hex_md5<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> p<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> binl2hex<span style="color: #009900;">&#40;</span>core_md5<span style="color: #009900;">&#40;</span>str2binl<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span>, p.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> core_md5<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> s, <span style="color: #000066; font-weight: bold;">int</span> k<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		s<span style="color: #009900;">&#91;</span>k <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">|=</span> <span style="color: #cc66cc;">128</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">%</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		s<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>k <span style="color: #339933;">+</span> <span style="color: #cc66cc;">64</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;&gt;&gt;</span> <span style="color: #cc66cc;">9</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> k<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> o <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1732584193</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> n <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">271733879</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> m <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1732584194</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> l <span style="color: #339933;">=</span> <span style="color: #cc66cc;">271733878</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> g <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> g <span style="color: #339933;">&lt;</span> s.<span style="color: #006633;">length</span><span style="color: #339933;">;</span> g <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	        <span style="color: #000066; font-weight: bold;">int</span> j <span style="color: #339933;">=</span> o<span style="color: #339933;">;</span>
	        <span style="color: #000066; font-weight: bold;">int</span> h <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
	        <span style="color: #000066; font-weight: bold;">int</span> f <span style="color: #339933;">=</span> m<span style="color: #339933;">;</span>
	        <span style="color: #000066; font-weight: bold;">int</span> e <span style="color: #339933;">=</span> l<span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">680876936</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">12</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">389564586</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">17</span>, <span style="color: #cc66cc;">606105819</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">22</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1044525330</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">176418897</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">12</span>, <span style="color: #cc66cc;">1200080426</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">17</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1473231341</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">22</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">45705983</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">1770035416</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">12</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1958414417</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">17</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">42063</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">11</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">22</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1990404162</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">12</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">1804603682</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">13</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">12</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">40341101</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">17</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1502002290</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_ff<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">22</span>, <span style="color: #cc66cc;">1236535329</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">165796510</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1069501632</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">11</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">14</span>, <span style="color: #cc66cc;">643717713</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">20</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">373897302</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">701558691</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">38016083</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">14</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">660478335</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">20</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">405537848</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">568446438</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1019803690</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">14</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">187363961</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">20</span>, <span style="color: #cc66cc;">1163531501</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">13</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1444681467</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">51403784</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">14</span>, <span style="color: #cc66cc;">1735328473</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_gg<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">12</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">20</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1926607734</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">378558</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">11</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">2022574463</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">11</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">16</span>, <span style="color: #cc66cc;">1839030562</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">23</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">35309556</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1530992060</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">11</span>, <span style="color: #cc66cc;">1272893353</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">16</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">155497632</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">23</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1094730640</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">13</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">681279174</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">11</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">358537222</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">16</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">722521979</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">23</span>, <span style="color: #cc66cc;">76029189</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">640364487</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">12</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">11</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">421815835</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">16</span>, <span style="color: #cc66cc;">530742520</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_hh<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">23</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">995338651</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">198630844</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">10</span>, <span style="color: #cc66cc;">1126891415</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">15</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1416354905</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">21</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">57434055</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">12</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">1700485571</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">10</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1894986606</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">15</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1051523</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">21</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">2054922799</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">1873313359</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">10</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">30611744</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">15</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1560198380</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">13</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">21</span>, <span style="color: #cc66cc;">1309151649</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>o, n, m, l, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">145523070</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>l, o, n, m, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">11</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">10</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1120210379</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>m, l, o, n, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">15</span>, <span style="color: #cc66cc;">718787259</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> md5_ii<span style="color: #009900;">&#40;</span>n, m, l, o, s<span style="color: #009900;">&#91;</span>g <span style="color: #339933;">+</span> <span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">21</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">343485551</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        o <span style="color: #339933;">=</span> safe_add<span style="color: #009900;">&#40;</span>o, j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        n <span style="color: #339933;">=</span> safe_add<span style="color: #009900;">&#40;</span>n, h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        m <span style="color: #339933;">=</span> safe_add<span style="color: #009900;">&#40;</span>m, f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        l <span style="color: #339933;">=</span> safe_add<span style="color: #009900;">&#40;</span>l, e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    <span style="color: #009900;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> rs <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		rs<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> o<span style="color: #339933;">;</span>
		rs<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
		rs<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> m<span style="color: #339933;">;</span>
		rs<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> l<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> rs<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> str2binl<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> p<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> s <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> a <span style="color: #339933;">=</span> <span style="color: #cc66cc;">254</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> p.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">;</span> i <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			s<span style="color: #009900;">&#91;</span> i <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">|=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>p.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">/</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> a <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">%</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> s<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		QQ q <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> QQ<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> verifyURL <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://ptlogin2.qq.com/check?uin=9920317&amp;appid=46000101&amp;r=0.37908964480776913&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> loginURL <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://ptlogin2.qq.com/login?&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> redirectURL <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> cookie <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> qqn <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;9920317&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> md5Pass <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> verifyCode <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">HttpURLConnection</span> urlConn <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">HttpURLConnection</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">URL</span><span style="color: #009900;">&#40;</span>verifyURL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">openConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setDoOutput</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setDoInput</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setUseCaches</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setAllowUserInteraction</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setRequestMethod</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;GET&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> cookie1 <span style="color: #339933;">=</span> urlConn.<span style="color: #006633;">getHeaderField</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Set-Cookie&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">BufferedReader</span> br <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span>urlConn.<span style="color: #006633;">getInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">StringBuffer</span> sb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">StringBuffer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> str <span style="color: #339933;">=</span> br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">!=</span> str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			str <span style="color: #339933;">=</span> br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		br.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">disconnect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		verifyCode <span style="color: #339933;">=</span> sb.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">18</span>, sb.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		loginURL <span style="color: #339933;">+=</span> <span style="color: #0000ff;">&quot;u=9920317&amp;p=&quot;</span><span style="color: #339933;">;</span>
		loginURL <span style="color: #339933;">+=</span> qq.<span style="color: #006633;">md5</span><span style="color: #009900;">&#40;</span>qq.<span style="color: #006633;">md5_3</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> verifyCode.<span style="color: #006633;">toUpperCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		loginURL <span style="color: #339933;">+=</span> <span style="color: #0000ff;">&quot;&amp;verifycode=&quot;</span><span style="color: #339933;">+</span>verifyCode.<span style="color: #006633;">toUpperCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;&amp;aid=46000101&amp;u1=http%3A%2F%2Ft.qq.com&amp;h=1&amp;from_ui=1&amp;fp=loginerroralert&quot;</span><span style="color: #339933;">;</span>
		urlConn <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">HttpURLConnection</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">URL</span><span style="color: #009900;">&#40;</span>loginURL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">openConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setDoOutput</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setDoInput</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setUseCaches</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setAllowUserInteraction</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">setRequestProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Cookie&quot;</span>, cookie1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> setCookies <span style="color: #339933;">=</span> urlConn.<span style="color: #006633;">getHeaderFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Set-Cookie&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">String</span> cookie2 <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
		cookie2 <span style="color: #339933;">+=</span> setCookies<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">30</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		cookie2 <span style="color: #339933;">+=</span> setCookies<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">27</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		cookie2 <span style="color: #339933;">+=</span> setCookies<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">24</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		cookie2 <span style="color: #339933;">+=</span> setCookies<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		cookie2 <span style="color: #339933;">=</span> cookie2.<span style="color: #006633;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span>, <span style="color: #0000ff;">';'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		cookie2 <span style="color: #339933;">=</span> cookie2.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span>, cookie2.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		out.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span>cookie2 <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;&lt;hr /&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		br <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span>urlConn.<span style="color: #006633;">getInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;;</span>
		str <span style="color: #339933;">=</span> br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		sb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">StringBuffer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">!=</span> str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			str <span style="color: #339933;">=</span> br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		br.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		urlConn.<span style="color: #006633;">disconnect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> md5_cmn<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> h, <span style="color: #000066; font-weight: bold;">int</span> e, <span style="color: #000066; font-weight: bold;">int</span> d, <span style="color: #000066; font-weight: bold;">int</span> c, <span style="color: #000066; font-weight: bold;">int</span> g, <span style="color: #000066; font-weight: bold;">int</span> f<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> safe_add<span style="color: #009900;">&#40;</span>bit_rol<span style="color: #009900;">&#40;</span>safe_add<span style="color: #009900;">&#40;</span>safe_add<span style="color: #009900;">&#40;</span>e, h<span style="color: #009900;">&#41;</span>, safe_add<span style="color: #009900;">&#40;</span>c, f<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>, g<span style="color: #009900;">&#41;</span>, d<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> md5_ff<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> g, <span style="color: #000066; font-weight: bold;">int</span> f, <span style="color: #000066; font-weight: bold;">int</span> k, <span style="color: #000066; font-weight: bold;">int</span> j, <span style="color: #000066; font-weight: bold;">int</span> e, <span style="color: #000066; font-weight: bold;">int</span> i, <span style="color: #000066; font-weight: bold;">int</span> h<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> md5_cmn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>f <span style="color: #339933;">&amp;</span> k<span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>~f<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> j<span style="color: #009900;">&#41;</span>, g, f, e, i, h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> md5_gg<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> g, <span style="color: #000066; font-weight: bold;">int</span> f, <span style="color: #000066; font-weight: bold;">int</span> k, <span style="color: #000066; font-weight: bold;">int</span> j, <span style="color: #000066; font-weight: bold;">int</span> e, <span style="color: #000066; font-weight: bold;">int</span> i, <span style="color: #000066; font-weight: bold;">int</span> h<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> md5_cmn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>f <span style="color: #339933;">&amp;</span> j<span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">&amp;</span> <span style="color: #009900;">&#40;</span>~j<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>, g, f, e, i, h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> md5_hh<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> g, <span style="color: #000066; font-weight: bold;">int</span> f, <span style="color: #000066; font-weight: bold;">int</span> k, <span style="color: #000066; font-weight: bold;">int</span> j, <span style="color: #000066; font-weight: bold;">int</span> e, <span style="color: #000066; font-weight: bold;">int</span> i, <span style="color: #000066; font-weight: bold;">int</span> h<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> md5_cmn<span style="color: #009900;">&#40;</span>f <span style="color: #339933;">^</span> k <span style="color: #339933;">^</span> j, g, f, e, i, h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> md5_ii<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> g, <span style="color: #000066; font-weight: bold;">int</span> f, <span style="color: #000066; font-weight: bold;">int</span> k, <span style="color: #000066; font-weight: bold;">int</span> j, <span style="color: #000066; font-weight: bold;">int</span> e, <span style="color: #000066; font-weight: bold;">int</span> i, <span style="color: #000066; font-weight: bold;">int</span> h<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> md5_cmn<span style="color: #009900;">&#40;</span>k <span style="color: #339933;">^</span> <span style="color: #009900;">&#40;</span>f <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span>~j<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>, g, f, e, i, h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> safe_add<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> a, <span style="color: #000066; font-weight: bold;">int</span> d<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">int</span> c <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">65535</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>d <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">65535</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> b <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>d <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>c <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span>c <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">65535</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> bit_rol<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> a, <span style="color: #000066; font-weight: bold;">int</span> b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&lt;&lt;</span> b<span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&gt;&gt;&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">32</span> <span style="color: #339933;">-</span> b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> binl2hex<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> c<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    <span style="color: #003399;">String</span> b <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;0123456789ABCDEF&quot;</span><span style="color: #339933;">;</span>
	    <span style="color: #003399;">String</span> d <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
	    <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> a <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> a <span style="color: #339933;">&lt;</span>c.<span style="color: #006633;">length</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span> a<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    	<span style="color: #000066; font-weight: bold;">char</span> x <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#41;</span>b.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#91;</span>a <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">%</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    	<span style="color: #000066; font-weight: bold;">char</span> y <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#41;</span>b.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#91;</span>a <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">%</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    	d <span style="color: #339933;">+=</span> x<span style="color: #339933;">;</span>
	    	d <span style="color: #339933;">+=</span> y<span style="color: #339933;">;</span>
	    <span style="color: #009900;">&#125;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> d.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>跑了几次都返回的是：</p>
<blockquote><p>ptuiCB(&#8217;7&#8242;,&#8217;0&#8242;,&#8221;,&#8217;0&#8242;);</p></blockquote>
<p>提示：您的输入有误, 请重试。<br />
而按理来说返回的应该是：</p>
<blockquote><p>ptuiCB(&#8217;0&#8242;,&#8217;0&#8242;,&#8217;http://t.qq.com&#8217;,&#8217;0&#8242;);</p></blockquote>
<p>密码错误则是：</p>
<blockquote><p>ptuiCB(&#8217;3&#8242;,&#8217;0&#8242;,&#8221;,&#8217;0&#8242;);</p></blockquote>
<p>用同样的参数在我写的和官方JavaScript产生的请求地址是一模一样的，可就是不成功。<br />
目前想到的两点：<br />
1.我使用了两次HttpURLConnection，Session不一致。<br />
2.服务器上对Referer进行了验证。</p>
<p>虽说没成功，但是也学到了不少，NND，光这个login_t.js里面的算法就够学的了 <img src='http://www.ineeke.com/wp-includes/images/smilies/icon_twisted.gif' alt='n:-gg' class='wp-smiley' /> 。<br />
发现一个有意思的地方：在login_t.js的str2binl函数中有如下一行代码（chrsz是个常数8，我的代码中直接写的8）：</p>
<blockquote><p>c[b>>5] |= (d.charCodeAt(b / chrsz) &#038; a) << (b % 32)</p></blockquote>
<p> 而我用Java语言来写这个方法时必须得写成这样： </p>
<blockquote><p>s[i>> 5] |= ((p.charAt(i / 8)) &#038; a + 1) << (i % 32);</p></blockquote>
<p>不然结果就不一致。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月14日 -- <a href="http://www.ineeke.com/archives/java-initialization-with-inheritance/" title="Java中的初始化与继承的流程">Java中的初始化与继承的流程</a><br /><small>想知道流程是怎样的，最简单的方法就是在每一个必要的地方输出一下，类似下断点去de...</small></li><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月25日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-success/" title="Java模拟腾讯微博的网页登录成功">Java模拟腾讯微博的网页登录成功</a><br /><small>继昨日[Java模拟腾讯微博的网页登录失败]，终于找到了原因，问题出在登录时u1...</small></li><li>2010年06月9日 -- <a href="http://www.ineeke.com/archives/stupid-about-java-equals/" title="犯傻了 关于Java中的equals">犯傻了 关于Java中的equals</a><br /><small>一个没注意就写了这么一段代码，乍看起来好像没错，IDE也没有提示有错。
判断结...</small></li><li>2010年05月26日 -- <a href="http://www.ineeke.com/archives/bad-version-number-in-class-file/" title="Bad version number in class file">Bad version number in class file</a><br /><small>突然就蹦出来这么个异常，咋解决呢？分析一下，就一个version便能知道一半了。...</small></li><li>2010年05月21日 -- <a href="http://www.ineeke.com/archives/jxl-copying-and-modifying-spreadsheets/" title="使用JXL操作Excel文件">使用JXL操作Excel文件</a><br /><small>[使用jsp实现word、excel格式报表打印]]的方式导出Excel很简单，...</small></li><li>2010年05月11日 -- <a href="http://www.ineeke.com/archives/how-a-garbage-collector-works/" title="Java中的垃圾回收器如何工作的">Java中的垃圾回收器如何工作的</a><br /><small>如果你接触过开销巨大的在堆中分配对象的编程语言，你或许会很自然的认为Java中的...</small></li><li>2010年05月10日 -- <a href="http://www.ineeke.com/archives/calling-constructors-from-constructors/" title="Java构造函数中调用构造函数">Java构造函数中调用构造函数</a><br /><small>在Java中，当为一个类创建了多个构造函数时，有时想在一个构造函数中调用另一个构...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript动态时钟</title>
		<link>http://www.ineeke.com/archives/javascript-dynamic-clock/</link>
		<comments>http://www.ineeke.com/archives/javascript-dynamic-clock/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 04:43:25 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/javascript-dynamic-clock/</guid>
		<description><![CDATA[继续玩JavaScript CanvasRenderingContext2D。前面画出来的都是“死”的，下面结合前面两个例子做一个“动”态时钟。当然还是得先了解一下即将用到的一些新属性及方法。]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_1223" class="wp-caption alignright" style="width: 127px"><a href="http://img.ineeke.com/2010/04/JavaScript-dynamic-clock.png" class="highslide-image" onclick="return hs.expand(this);"><img class="size-full wp-image-1223" title="JavaScript dynamic clock" src="http://img.ineeke.com/2010/04/JavaScript-dynamic-clock.png" alt="JavaScript dynamic clock" width="117" height="117" /></a><p class="wp-caption-text">JavaScript dynamic clock</p></div><br />
继续玩JavaScript CanvasRenderingContext2D。前面画出来的都是“死”的，下面结合前面两个例子做一个“动”态时钟。当然还是得先了解一下即将用到的一些新属性及方法。<br />
<strong>方法</strong><br />
save()：<br />
将当前图形信息存储在栈中。</p>
<p>restore()：<br />
从栈中取出图形信息并应用。</p>
<p>clearRect(float x, float y, float width, float height)：<br />
清空指定区域的图像并透明化。</p>
<p>translate(float dx, float dy)：<br />
为画布的变换矩阵添加水平的和垂直的偏移。参数 dx 和 dy 添加给后续定义路径中的所有点。</p>
<p>scale(float sx, float sy)：<br />
横纵缩放。</p>
<p>rotate(angle)：<br />
旋转，angle为弧度数。</p>
<p>lineTo(float x, float y)：<br />
指定线条终点坐标。</p>
<p>fill()：<br />
填充图形。</p>
<p><strong>属性</strong></p>
<p>lineWidth：<br />
线条宽度</p>
<p>lineCap：<br />
指定线段如何结束。只有绘制较宽线段时，它才有效。这个属性的合法值如下表所示。默认值是：&#8221;butt&#8221;。<br />
&#8220;butt&#8221; 	这个默认值指定了线段应该没有线帽。线条的末点是平直的而且和线条的方向正交，这条线段在其端点之外没有扩展。<br />
&#8220;round&#8221; 	这个值指定了线段应该带有一个半圆形的线帽，半圆的直径等于线段的宽度，并且线段在端点之外扩展了线段宽度的一半。<br />
&#8220;square&#8221; 	这个值表示线段应该带有一个矩形线帽。这个值和 &#8220;butt&#8221; 一样，但是线段扩展了自己的宽度的一半。<br />
其它方法及属性可参见<a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" target="_blank">JavaScript CanvasRenderingContext2D在canvas上绘图</a>及<a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" target="_blank">JavaScript绘制笑脸</a>。<br />
下面给出代码：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> clock<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> now <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> ctx <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'clock'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//保存状态，将当前状态压栈</span>
	ctx.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//清理图像</span>
	ctx.<span style="color: #660066;">clearRect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">150</span><span style="color: #339933;">,</span><span style="color: #CC0000;">150</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//已(75, 75)为原点，将图像复制</span>
	ctx.<span style="color: #660066;">translate</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">75</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">75</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//横纵比</span>
	ctx.<span style="color: #660066;">scale</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0.5</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0.5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//逆转90°</span>
	ctx.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">/</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//设置线条颜色</span>
	ctx.<span style="color: #660066;">strokeStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;black&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//设置填充颜色</span>
	ctx.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;white&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//设置线条宽度</span>
	ctx.<span style="color: #660066;">lineWidth</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//设置线边角为圆角</span>
	ctx.<span style="color: #660066;">lineCap</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;round&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//保存状态，将当前状态压栈</span>
	ctx.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//画出12个时刻</span>
	<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #CC0000;">12</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-style: italic;">//以当前原点为圆心</span>
		ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #006600; font-style: italic;">//旋转30°</span>
		ctx.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">/</span><span style="color: #CC0000;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #006600; font-style: italic;">//以圆心外100像素处为起点，120像素处为终点画线</span>
		ctx.<span style="color: #660066;">moveTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">100</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		ctx.<span style="color: #660066;">lineTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">120</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #006600; font-style: italic;">//画出这条路线</span>
		ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #006600; font-style: italic;">//出栈，将取出的状态作为当前状态</span>
	ctx.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//再将状态压栈，保存起来</span>
	ctx.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//设置线条宽度</span>
	ctx.<span style="color: #660066;">lineWidth</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//画出60个分钟</span>
	<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">60</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #006600; font-style: italic;">//因为时针就是每五分钟的点了，所以跳过不画了</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">%</span>5<span style="color: #339933;">!=</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		  ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		  ctx.<span style="color: #660066;">moveTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">117</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		  ctx.<span style="color: #660066;">lineTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">120</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		  ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #006600; font-style: italic;">//旋转6°</span>
		ctx.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">/</span><span style="color: #CC0000;">30</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #006600; font-style: italic;">//出栈，将取出的状态作为当前状态</span>
	ctx.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">//取出当前秒</span>
	<span style="color: #003366; font-weight: bold;">var</span> sec <span style="color: #339933;">=</span> now.<span style="color: #660066;">getSeconds</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//取出当前分</span>
	<span style="color: #003366; font-weight: bold;">var</span> min <span style="color: #339933;">=</span> now.<span style="color: #660066;">getMinutes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//取出当前时</span>
	<span style="color: #003366; font-weight: bold;">var</span> hr  <span style="color: #339933;">=</span> now.<span style="color: #660066;">getHours</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//判断是否是24小时计时法，是则减12</span>
	hr <span style="color: #339933;">=</span> hr<span style="color: #339933;">&gt;=</span><span style="color: #CC0000;">12</span> <span style="color: #339933;">?</span> hr<span style="color: #339933;">-</span><span style="color: #CC0000;">12</span> <span style="color: #339933;">:</span> hr<span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//再将状态压栈，保存起来</span>
	ctx.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// 画出时针</span>
	<span style="color: #006600; font-style: italic;">//时针转向当前位置</span>
	ctx.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span> hr<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">/</span><span style="color: #CC0000;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">/</span><span style="color: #CC0000;">360</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>min <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">/</span><span style="color: #CC0000;">21600</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>sec <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//设置时针宽度</span>
	ctx.<span style="color: #660066;">lineWidth</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">14</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//以当前原点为圆心</span>
	ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//反向延长20个像素</span>
	ctx.<span style="color: #660066;">moveTo</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">20</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">lineTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">80</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//画线</span>
	ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">//画分针</span>
	ctx.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">/</span><span style="color: #CC0000;">30</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>min <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">/</span><span style="color: #CC0000;">1800</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>sec <span style="color: #009900;">&#41;</span>
	ctx.<span style="color: #660066;">lineWidth</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">strokeStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'blue'</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">moveTo</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">28</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">lineTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">112</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">//画秒针</span>
	ctx.<span style="color: #660066;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">rotate</span><span style="color: #009900;">&#40;</span>sec <span style="color: #339933;">*</span> Math.<span style="color: #660066;">PI</span><span style="color: #339933;">/</span><span style="color: #CC0000;">30</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">strokeStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;red&quot;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;red&quot;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">lineWidth</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">6</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">moveTo</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">30</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">lineTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">120</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">10</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">*</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">fill</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">90</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">10</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">*</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;black&quot;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">*</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">fill</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">//加一个表盘</span>
	ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">lineWidth</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">14</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">strokeStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'gray'</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">142</span><span style="color: #339933;">,</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>Math.<span style="color: #660066;">PI</span><span style="color: #339933;">*</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ctx.<span style="color: #660066;">restore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>在浏览器里面看看吧 <img src='http://www.ineeke.com/wp-includes/images/smilies/icon_smile.gif' alt='n:-wx' class='wp-smiley' /> ！咦！为什么没有动呢？这可不是GIF图片啊！怎么动呢？</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> initClock<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	clock<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	setInterval<span style="color: #009900;">&#40;</span>clock<span style="color: #339933;">,</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>再加一段如上代码进去，然后调用initClock()方法，现在再看看，动了吧。其实每次看到的都是一张静止的图片，只是每隔一秒将当前的时间以钟表的样子画上去而已。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li><li>2010年04月6日 -- <a href="http://www.ineeke.com/archives/variables-as-properties/" title="JavaScript变量与对象属性">JavaScript变量与对象属性</a><br /><small>你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/javascript-dynamic-clock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript绘制笑脸</title>
		<link>http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/</link>
		<comments>http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 02:18:31 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/</guid>
		<description><![CDATA[可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位？）所以必须得知道圆的定义：1.平面上到定点的距离等于定长的点的集合叫圆,2.平面上一条线段，绕它的一端旋转360°，留下的轨迹叫圆，另外还得知道坐标系以及CanvasRenderingContext2D提供的方法。]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_1221" class="wp-caption alignright" style="width: 125px"><a href="http://img.ineeke.com/2010/04/smile_face.png" class="highslide-image" onclick="return hs.expand(this);"><img class="size-full wp-image-1221" title="smile face" src="http://img.ineeke.com/2010/04/smile_face.png" alt="smile face" width="115" height="113" /></a><p class="wp-caption-text">smile face</p></div><br />
可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位？）所以必须得知道圆的定义：1.平面上到定点的距离等于定长的点的集合叫圆,2.平面上一条线段，绕它的一端旋转360°，留下的轨迹叫圆，另外还得知道坐标系以及CanvasRenderingContext2D提供的方法。<br />
以下是将要用到的几个CanvasRenderingContext2D的方法及属性：<br />
<strong>方法﻿</strong></p>
<ol>
<li>beginPath()
<ul>
<li>清除任何已定义的路径并创建一个新的路径。当canvas的context被第一次创建时，该方法将自动被调用并设置当坐标点为(0, 0)。</li>
</ul>
</li>
<li>moveTo(float x, float y)
<ul>
<li>该方法将画笔移动到(x, y)并以此为起点开启一条子路径。如果再此之前已经存在了一个子路径，且该路径中只存在一个点，那么这个路径将被删除。</li>
</ul>
</li>
<li>arc(float x, float y, float radius, float startAngle, endAngle,boolean counterclockwise)
<ul>
<li>x,y
<ul>
<li>圆心坐标</li>
</ul>
</li>
<li>radius
<ul>
<li>半径</li>
</ul>
</li>
<li>startAngle,endAngle
<ul>
<li>弧度</li>
</ul>
</li>
<li>counterclockwise
<ul>
<li>true为逆时针，false为顺时针</li>
</ul>
</li>
</ul>
</li>
<li>stroke()
<ul>
<li>画出当前路径的几何图形，其视觉效果依靠strokeStyle，lineWidth,，lineCap,，lineJoin及miterLimit 属性。</li>
</ul>
</li>
</ol>
<p><strong>属性</strong></p>
<ol>
<li>strokeStyle
<ul>
<li>设置几何图形的颜色</li>
</ul>
</li>
</ol>
<p>这个圆不简单吧，需要这么多知识，不过应该不是很难吧。下面给出代码：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> canvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'canvas'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ctx <span style="color: #339933;">=</span> canvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//注意：默认起始坐标（0, 0）位置在左上角</span>
ctx.<span style="color: #660066;">beginPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//设置图形为红色</span>
ctx.<span style="color: #660066;">strokeStyle</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'red'</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//以（75, 75）点为圆心，50为半径，弧度数为0到2π（360°），逆时针画圆</span>
ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">75</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">75</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> Math.<span style="color: #660066;">PI</span><span style="color: #339933;">*</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//画笔移动至（110, 75）</span>
ctx.<span style="color: #660066;">moveTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">110</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">75</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//因为嘴巴是个半圆，所以弧度数是0到π，嘴巴长在下面而不是上面，所以顺时针画</span>
ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">75</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">75</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">35</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> Math.<span style="color: #660066;">PI</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ctx.<span style="color: #660066;">moveTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">65</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">65</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//画出左眼</span>
ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">60</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">65</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> Math.<span style="color: #660066;">PI</span><span style="color: #339933;">*</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ctx.<span style="color: #660066;">moveTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">95</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">65</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//画出右眼</span>
ctx.<span style="color: #660066;">arc</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">90</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">65</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> Math.<span style="color: #660066;">PI</span><span style="color: #339933;">*</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//这时候你在浏览器上是什么也看不到的，必须调用下面的方法才能够看到</span>
ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li><li>2010年04月6日 -- <a href="http://www.ineeke.com/archives/variables-as-properties/" title="JavaScript变量与对象属性">JavaScript变量与对象属性</a><br /><small>你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaScript CanvasRenderingContext2D在canvas上绘图</title>
		<link>http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/</link>
		<comments>http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 02:28:30 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/</guid>
		<description><![CDATA[看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用JavaScript在canvas标签上通过 CanvasRenderingContext2D对象画出来的。接下来看看如果通过JavaScript画出这张图来。]]></description>
			<content:encoded><![CDATA[<div id="attachment_1219" class="wp-caption alignright" style="width: 164px"><a href="http://img.ineeke.com/2010/04/canvas-one.png" class="highslide-image" onclick="return hs.expand(this);"><img class="size-full wp-image-1219" title="canvas" src="http://img.ineeke.com/2010/04/canvas-one.png" alt="canvas" width="154" height="123" /></a><p class="wp-caption-text">canvas</p></div>
<p>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用JavaScript在canvas标签上通过CanvasRenderingContext2D对象画出来的。接下来看看如果通过JavaScript画出这张图来。<br />
首先需要了解以下知识：<br />
<strong>HTML中用于脚本画图的canvas元素</strong><br />
目前Firefox 1.5, Safari 1.3,及Opera 9以上版本都支持此元素，鸟IE都出8了，还是不支持，想在IE上看可以安装<a href="http://excanvas.sourceforge.net/" target="_blank">http://excanvas.sourceforge.net</a>来模拟效果。</p>
<ol>
<li>属性
<ul>
<li>height默认值300</li>
</ul>
<ul>
<li>width默认值300</li>
</ul>
</li>
<li>方法
<ul>
<li>getContext()返回一个CanvasRenderingContext2D对象用于在canvas上绘图，你必须传入字符串参数“2d”</li>
</ul>
</li>
</ol>
<p><strong>CanvasGradient</strong></p>
<p>可以将该对象赋值给CanvasRenderingContext2D对象的<tt>strokeStyle及</tt><tt>fillStyle属性。</tt>CanvasRenderingContext2D<tt>对象的createLinearGradient()及</tt><tt>createRadialGradient()返回类型均为</tt>CanvasGradient。</p>
<p>该对象的addColorStop(float <tt><em>offset</em></tt>, String <tt><em>color</em></tt>)方法可以改变指定点的颜色。该方法至少要使用一次，否则绘图将是透明的。</p>
<p><strong>CanvasRenderingContext2D.createRadialGradient( )</strong></p>
<ol>
<li>方法介绍
<ul>
<li>CanvasGradient createRadialGradient(float <tt><em>xStart</em></tt>,  float <tt><em>yStart</em></tt>, float <tt><em>radiusStart</em></tt>,                                      float <tt><em>xEnd</em></tt>, float <tt><em>yEnd</em></tt>,  float <tt><em>radiusEnd</em></tt>)</li>
</ul>
</li>
<li>参数
<ul>
<li><tt><em>xStart, yStart</em></tt>
<ul>
<li><tt><em>起始圆圆心坐标</em></tt></li>
</ul>
</li>
<li><tt><em>radiusStart</em></tt>
<ul>
<li><tt>起始圆半径</tt></li>
</ul>
</li>
</ul>
<ul>
<li><tt><em>xEnd, yEnd</em></tt>
<ul>
<li><tt><em>结束圆圆心坐标</em></tt></li>
</ul>
</li>
<li><tt><em>radiusEnd</em></tt>
<ul>
<li><tt>结束圆半径</tt></li>
</ul>
</li>
</ul>
</li>
<li><tt>返回值</tt>
<ul>
<li><tt>一个</tt>CanvasGradient对象</li>
</ul>
</li>
</ol>
<p><strong>样例</strong><br />
以下是实现上图效果的JavaScript代码：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> canvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'canvas'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> ctx <span style="color: #339933;">=</span> canvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> radial <span style="color: #339933;">=</span> ctx.<span style="color: #660066;">createRadialGradient</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">60</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">75</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">75</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
radial.<span style="color: #660066;">addColorStop</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'#000'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
radial.<span style="color: #660066;">addColorStop</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0.5</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'red'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
radial.<span style="color: #660066;">addColorStop</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'#999'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ctx.<span style="color: #660066;">fillStyle</span> <span style="color: #339933;">=</span> radial<span style="color: #339933;">;</span>
ctx.<span style="color: #660066;">stroke</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ctx.<span style="color: #660066;">fillRect</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">200</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">150</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li><li>2010年04月6日 -- <a href="http://www.ineeke.com/archives/variables-as-properties/" title="JavaScript变量与对象属性">JavaScript变量与对象属性</a><br /><small>你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>构建自己的JavaScript库</title>
		<link>http://www.ineeke.com/archives/build-your-own-javascript-libraries/</link>
		<comments>http://www.ineeke.com/archives/build-your-own-javascript-libraries/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 03:58:53 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[extjs]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/build-your-own-javascript-libraries/</guid>
		<description><![CDATA[外面有一批流行的JavaScript库，如<a target="_blank" href="http://jquery.com/">jQuery</a>、 <a target="_blank" href="http://www.extjs.com">ExtJS</a>及<a target="_blank" href="http://dojotoolkit.org/">Dojo</a>等。通过下面的一个简单的框架，我们也可以构建出属于自己的JavaScript库。]]></description>
			<content:encoded><![CDATA[<p>外面有一批流行的JavaScript库，如<a target="_blank" href="http://jquery.com/">jQuery</a>、 <a target="_blank" href="http://www.extjs.com">ExtJS</a>及<a target="_blank" href="http://dojotoolkit.org/">Dojo</a>等。通过下面的一个简单的框架，我们也可以构建出属于自己的JavaScript库。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">//一个新的命名空间，防止与其它库冲突</span>
	window<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'Neeke'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">//自己编写的一些方法</span>
	<span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066;">alert</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		window.<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>msg<span style="color: #339933;">+</span><span style="color: #3366CC;">'www.ineeke.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #006600; font-style: italic;">//纳入自己的库中</span>
	window<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'Neeke'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'alert'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">alert</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">//销毁变量</span>
	<span style="color: #000066;">alert</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">delete</span> <span style="color: #000066;">alert</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>上面只是一个样例，是不是很简单呢？你可以在其基础上扩展，可以将自己编写或者收集一些经常用到的JavaScript方法放进去。<br />
用法：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">Neeke</span>.<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>由于所有全局变量都是window的属性，所以上面的代码可以精简一下：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">Neeke.<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>与ExtJS对比一下：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">Msg</span>.<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'www.ineeke.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>很相像吧！至于后两行代码，有人说不再使用的变量置为null即可，有人说对它执行delete也行，然后就让垃圾回收器自己去处理。两个都使用是我在ExtJS官方论坛的一篇帖子中无意中（貌似发生在去年的某一天 <img src='http://www.ineeke.com/wp-includes/images/smilies/icon_mrgreen.gif' alt='n:-hd' class='wp-smiley' /> ）看到的，那个老外称之为“full destroy”。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年01月8日 -- <a href="http://www.ineeke.com/archives/print-the-contents-of-ext-components/" title="打印Ext组件中的内容">打印Ext组件中的内容</a><br /><small>描述一下大概功能需求：从Ext的GridPanel中选择一条记录，将这条记录的详...</small></li><li>2009年09月1日 -- <a href="http://www.ineeke.com/archives/ext-code-optimization-and-to-reduce-the-amount-of-coding/" title="Ext代码优化并减少编码量">Ext代码优化并减少编码量</a><br /><small>Ext做的项目里经常要将几个组件合起来做成一个具有某一功能的组件，而且这样的功能...</small></li><li>2010年07月11日 -- <a href="http://www.ineeke.com/archives/can-not-fire-custom-event-in-ext/" title="Ext中无法触发自定义事件">Ext中无法触发自定义事件</a><br /><small>Ext中的自定义事件是个好东西，对于某些特殊需求的实现，用它是个很不错的选择。然...</small></li><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月15日 -- <a href="http://www.ineeke.com/archives/jquery-easyui/" title="jQuery EasyUI ">jQuery EasyUI </a><br /><small>又出现了一个JS库，是基于jQuery的，名为jQuery EasyUI。看官方...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/build-your-own-javascript-libraries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript闭包</title>
		<link>http://www.ineeke.com/archives/javascript-closures/</link>
		<comments>http://www.ineeke.com/archives/javascript-closures/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 02:42:57 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/javascript-closures/</guid>
		<description><![CDATA[我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作用域的交互来实现令人惊奇且强大的效果。]]></description>
			<content:encoded><![CDATA[<blockquote><p>声明：本文系本人为学习英语及JavaScript基础而翻译《JavaScript The Definitive Guide》第五版，均为个人理解，略有删改，切勿完全信以为真，走火入魔。因本文引起的一切后果，读者自负，与本人无关。 </p></blockquote>
<p><strong>JavaScript使用嵌套函数实现闭包</strong></p>
<p>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作用域的交互来实现令人惊奇且强大的效果。下面我们开始探索，考虑一下一个函数g被定义在一个函数f中。当f被调用时，作用域链将在存储全局对象之后将函数f的call对象也存储进去。函数g被定义在函数f中，所以它的作用域链将作为函数g的定义的一部分被保存。当函数g被调用时，作用域链中将含有三个对象：函数g的call对象，函数f的call对象及全局对象。<br />
嵌套函数在他们被定义的同一语法域中被调用是很容易理解的，下面的代码并没有做任何令人特别惊讶的事情：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> <span style="color: #3366CC;">'global'</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">function</span> f<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> <span style="color: #3366CC;">'local'</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">function</span> g<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	g<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
f<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//调用该函数时显示“local”</span></pre></div></div>

<p>在JavaScript中，函数像其它值一样也是数据，所以它们也可从函数中被返回，例如可以将函数向对象属性赋值，存储在数组中等等。这不会导致任何奇怪的问题，除非嵌套函数被调用。考虑下面的代码，一个函数返回一个嵌套函数。每次它被调用时都返回一个函数。返回的函数的JavaScript代码也都是一样的，但其在被创建时的作用域每次都略有不同，因为每次调用传递进来的参数值都不同。如果你将返回的函数保存在一个数组里并逐一调用，你会发现每次都将返回一个不同值。由于每个函数都有完全相同的代码，并且都在同一作用域中被调用，唯一能够导致返回不同值的因素就是这些函数被定义时的作用域。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//每次调用该函数都将返回一个函数</span>
<span style="color: #006600; font-style: italic;">//每次调用，函数被定义的时的作用域都不同</span>
<span style="color: #003366; font-weight: bold;">function</span> makeFunction<span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">return</span> x<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">//调用几次makeFunction并将结果存在数组中</span>
<span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>makeFunction<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> makeFunction<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> makeFunction<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//现在调用这些函数并显示它们的值</span>
<span style="color: #006600; font-style: italic;">//虽然函数体都是一样的</span>
<span style="color: #006600; font-style: italic;">//但是它们的作用域及返回值都是不同的</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//显示0</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//显示1</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//显示2</span></pre></div></div>

<p>这段代码的结果正是你所期望的严格遵守语法域规则的应用：函数执行在它被定义时的作用域中。造成这个结果的原因令人惊讶，然而，是你希望在函数退出时将局部作用域也销毁。当一个函数被调用时，JavaScript解释器将为其创建一个call对象并放入作用域链中。当函数退出时，对应的call对象也将被从作用域链中移除。当没有嵌套函数被调用时，作用域链中将只涉及call对象。当此对象被从该链中移除时，链中没有任何元素，此时垃圾回收器将其处理。<br />
如果你在全局作用域中存放一个嵌套函数的引用事情就完全不同了。你可以通过将嵌套函数作为外部函数的返回值或者将嵌套函数作为其它对象的属性来达到这个效果。这两种方式在上例中都有使用到。JavaScript代码无法通过任何途径直接访问call对象，但是它被定义为任何嵌套函数作用域链的一部分。（记住：如果一个外部函数存储了两个嵌套函数的全局引用，这两个嵌套函数共享同一个call对象，任意一方发生改变对另一方都是可见的。）<br />
JavaScript函数是将被执行的代码及执行他们的作用域的集合。在计算机科学中这称之为闭包。如果你理解了闭包，理解了作用域链和函数的call对象，你才是真正的高级JavaScript程序员。</p>
<p><strong>JavaScript闭包样例</strong></p>
<p>有时你想编写一个函数，它能够记住一个值并且跨调用。该值不能存储在函数的局部变量中，因为call对象不能保持跨调用。使用全局变量可以实现，但是这样会侵入全局命名空间。在<a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" target="_blank">JavaScript函数属性和方法</a>中我们命名了一个uniqueInteger()函数，它使用自身的一个属性来存储这个值。你可以使用闭包的方式进一步改进并且创建一个持久化的私有变量。下面是一个未使用闭包的函数：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//每次调用都返回一个不同的整型值</span>
uniqueID <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>arguments.<span style="color: #660066;">callee</span>.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		arguments.<span style="color: #660066;">callee</span>.<span style="color: #660066;">id</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000066; font-weight: bold;">return</span> arguments.<span style="color: #660066;">callee</span>.<span style="color: #660066;">id</span><span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>上面代码的问题在于，任何时候都可以将uniqueID.id修改为0，这将违反我们的要求。为了防止这样的问题发生，你可以将持久化值存储在闭包中，只有你的函数可以访问它：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">uniqueID <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>		<span style="color: #006600; font-style: italic;">//此函数的call对象管理我们的值</span>
	<span style="color: #003366; font-weight: bold;">var</span> id <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//这是一个私有的持久化值</span>
	<span style="color: #006600; font-style: italic;">//外部函数返回一个能够访问这个持久化值的嵌套函数</span>
	<span style="color: #006600; font-style: italic;">//正是这个函数存储着我们的uniqueID</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">return</span> id<span style="color: #339933;">++;</span>	<span style="color: #006600; font-style: italic;">//返回并递增</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//定义完后调用</span></pre></div></div>

<p><strong>IE浏览器的中JavaScript的闭包和内存泄露</strong></p>
<p>微软IE浏览器为ActiveX对象及客户端DOM元素使用了弱的垃圾回收器。这些客户端对象的引用数被统计下来，当引用数为0时就将它释放。当出现循环引用时这样的设计是失败的，例如一个核心JavaScript对象指向一个文档元素，并且这个元素的一个属性回指这个核心JavaScript对象。<br />
在IE的客户端程序设计中使用闭包，这样的引用循环将会反复出现。当你使用闭包时，记住函数的内附call对象包含所有的函数参数及局部变量，它们都与闭包的生命周期一致。如果函数中任何一个参数或者局部变量指向一个客户端对象，你很可能创建了一个内存泄露。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li><li>2010年04月6日 -- <a href="http://www.ineeke.com/archives/variables-as-properties/" title="JavaScript变量与对象属性">JavaScript变量与对象属性</a><br /><small>你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/javascript-closures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript函数作用域链</title>
		<link>http://www.ineeke.com/archives/javascript-function-scope/</link>
		<comments>http://www.ineeke.com/archives/javascript-function-scope/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 02:34:18 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/javascript-function-scope-and-closures/</guid>
		<description><![CDATA[如<a target="_blank" href="http://www.ineeke.com/archives/javascript-variable-scope/">JavaScript变量作用域</a>一文所说，JavaScript函数体的执行是局部作用域的。接下来我们将解释一些作用域问题以及JavaScript闭包。]]></description>
			<content:encoded><![CDATA[<blockquote><p>
声明：本文系本人为学习英语及JavaScript基础而翻译《JavaScript The Definitive Guide》第五版，均为个人理解，略有删改，切勿完全信以为真，走火入魔。因本文引起的一切后果，读者自负，与本人无关。
</p></blockquote>
<p>如<a target="_blank" href="http://www.ineeke.com/archives/javascript-variable-scope/">JavaScript变量作用域</a>一文所说，JavaScript函数体的执行是局部作用域的。接下来我们将解释一些作用域问题以及JavaScript闭包。</p>
<p><strong>JavaScript语法域</strong></p>
<p>JavaScript中的函数是语法域而不是动态域。意思就是说，它们运行在被定义的作用域中，而不是它们被执行的作用域中。当一个函数被定义时，当前的作用域链被保存为该函数的一个内部状态，在最外层函数中，作用域链只包含全局对象，这与语法域没有什么关系。当你定义一个嵌套函数时，该作用域链也包括包含函数。也就是说，嵌套函数可以访问包含函数的所有的参数及局部变量。</p>
<p>注意，虽然当一个函数被定义时作用域链是固定的，但是在作用域链中定义的属性确不是固定的。作用域链是“活”的，当函数被调用时，它可以访问当前作用域链中绑定着的任何内容。</p>
<p><strong>JavaScript Call对象</strong></p>
<p>当JavaScript解释器调用一个函数时，实际上是在函数被定义时它第一次将作用域放入作用域链。接着，它又放入一个call对象（在ECMAScript规范中的术语为“激活对象”）到作用域链的最前面。call对象在初始化时伴随着一个arguments属性，该属性指向函数的Arugments对象。函数中命名的参数被放在call对象之后。通过var声明的任何局部变量也都被定义在该对象中。由于call对象处在作用域链的头部，所以局部变量、函数参数以及Arguments对象都出于函数的作用域中了。这就意味着，任何排在作用域链后面的同名属性都将被隐藏。</p>
<p>注意，与arguments不同的是，this是一个关键字，而不是call对象的一个属性。</p>
<p><strong>Call对象作为命名空间</strong></p>
<p>定义一个函数去创建一个call对象来当作一个临时的命名空间有时是很有用的，这样你可以在该命名空间中定义变量或创建属性而不会侵入全局命名空间。例如你有一个JavaScript代码文件需要被用到一堆不同的JavaScript程序中。假如这段代码像大多数代码一样，定义变量并存储计算出来的中间值。问题在于，由于这段代码被用在各种不同的程序中，你不知道里面的变量是否会与其它程序中的变量发生冲突。<br />
解决办法很简单，就是将代码放进一个函数中，接着调用这个函数。这么一来，变量将被定义在这个函数的call对象中：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">//在这里声明的任何变量都将成为call对象的属性</span>
	<span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Neeke'</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> blog <span style="color: #339933;">=</span> <span style="color: #3366CC;">'http://www.ineeke.com'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">//别忘记要调用一下</span>
init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>上面的代码将只在全局命名空间中增加一个init属性，而这个init属性指向对应的函数。如果定义一个属性你都觉得太多，那么你可以试试匿名函数：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>	<span style="color: #006600; font-style: italic;">//这个函数没有名字</span>
	<span style="color: #006600; font-style: italic;">//在这里声明的任何变量都将成为call对象的属性</span>
	<span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Neeke'</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> blog <span style="color: #339933;">=</span> <span style="color: #3366CC;">'http://www.ineeke.com'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//结束函数语法并调用它</span></pre></div></div>

<p>注意，函数语法外面的圆括号在JavaScript的语法规则中是必须的。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li><li>2010年04月6日 -- <a href="http://www.ineeke.com/archives/variables-as-properties/" title="JavaScript变量与对象属性">JavaScript变量与对象属性</a><br /><small>你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/javascript-function-scope/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript函数属性和方法</title>
		<link>http://www.ineeke.com/archives/javascript-function-properties-and-methods/</link>
		<comments>http://www.ineeke.com/archives/javascript-function-properties-and-methods/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 01:22:23 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/javascript-function-properties-and-methods/</guid>
		<description><![CDATA[我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符应用于函数时将返回“function”，然而，JavaScript中的函数是一有特点的。当函数当作对象时，它同样有属性及方法，就像Date和RegExp对象一样。]]></description>
			<content:encoded><![CDATA[<blockquote><p>
声明：本文系本人为学习英语及JavaScript基础而翻译《JavaScript The Definitive Guide》第五版，均为个人理解，略有删改，切勿完全信以为真，走火入魔。因本文引起的一切后果，读者自负，与本人无关。
</p></blockquote>
<p>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符应用于函数时将返回“function”，然而，JavaScript中的函数是一有特点的。当函数当作对象时，它同样有属性及方法，就像Date和RegExp对象一样。</p>
<p><strong>函数长度属性</strong></p>
<p>在函数体中，arguments数组的length属性值是我们调用函数时实际传递的参数个数，函数自身的length属性则是定义函数时声明的预期的参数个数。函数能够以传递任意个参数调用，所有的参数都存在arguments数组中。与arguments.length所不同的是，函数的length属性在函数内外均可以访问。<br />
下面的代码定义了一个名为check()的函数，接收的是另一个函数的arguments数组。它判断arguments.length和Function.lenght（可以通过arguments.callee.length访问）是否一致（实际传递的参数个数与函数定义时的参数个数是否一致）。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//来自： www.ineeke.com</span>
<span style="color: #003366; font-weight: bold;">function</span> check<span style="color: #009900;">&#40;</span>args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> actual <span style="color: #339933;">=</span> args.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//实际参数个数</span>
	<span style="color: #003366; font-weight: bold;">var</span> expected <span style="color: #339933;">=</span> args.<span style="color: #660066;">callee</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//预期的参数个数</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>actual <span style="color: #339933;">!=</span> expected<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'实际参数个数与预期参数个数不一致'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> f<span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> z<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">//检查函数f被调用时的参数个数和预期参数个数</span>
	check<span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">return</span> x <span style="color: #339933;">+</span> y <span style="color: #339933;">+</span> z<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>定义自己的函数属性</strong></p>
<p>假设我们想要定义一个函数，无论何时被调用都返回一个唯一整型值。为了能够实现这样的功能，你很可能会选择声明一个全局变量去存储它，然而，这是没必要的，因为我们只想让函数自己来管理这个值。在下面的例子中，无论函数何时被调用都将返回一个唯一整型值：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//来自： www.ineeke.com</span>
<span style="color: #006600; font-style: italic;">//创建并初始化一个“静态”变量</span>
<span style="color: #006600; font-style: italic;">//因为函数在被执行前就已经被解释器处理，所以我们可以在函数被声明前使用它</span>
uniqueInteger.<span style="color: #660066;">counter</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//函数每次都返回一个不同的值</span>
<span style="color: #003366; font-weight: bold;">function</span> uniqueInteger<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">//递增并返回该“静态”变量</span>
	<span style="color: #000066; font-weight: bold;">return</span> uniqueInteger.<span style="color: #660066;">counter</span><span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>函数的apply()和call()方法</strong></p>
<p><a target="_blank" href="http://baike.baidu.com/view/810176.htm?fr=ala0_1">ECMAScript</a>为所有的函数指定了两个方法，apply()及call()。这两个方法允许我们将一个函数当作其它对象的一个方法使用。它们的第一个参数是一个对象（谁来调用这个函数），在函数中可以通过this关键字引用该对象。call()方法的其它参数都将传递给被调用的函数。例如，传递两个数字给函数f()并作为对象o的方法来调用，你可以像这样来做：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">f.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>o<span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>下面的代码与上面的代码是相似的。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">o.<span style="color: #660066;">m</span> <span style="color: #339933;">=</span> f<span style="color: #339933;">;</span>
o.<span style="color: #660066;">m</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">delete</span> o.<span style="color: #660066;">m</span><span style="color: #339933;">;</span></pre></div></div>

<p>apply()方法与call()方法唯一不同的是，其它参数是以数组的方式传递。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">f.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span>o<span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>例如，为了找出一个数组中最大的数字，你可以使用apply()方法将该数组传递给Math.max()函数：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> biggest <span style="color: #339933;">=</span> Math.<span style="color: #660066;">max</span>.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> array_of_numbers<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li><li>2010年04月6日 -- <a href="http://www.ineeke.com/archives/variables-as-properties/" title="JavaScript变量与对象属性">JavaScript变量与对象属性</a><br /><small>你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/javascript-function-properties-and-methods/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaScript变量作用域回顾</title>
		<link>http://www.ineeke.com/archives/variable-scope-revisited/</link>
		<comments>http://www.ineeke.com/archives/variable-scope-revisited/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 07:16:56 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/variable-scope-revisited/</guid>
		<description><![CDATA[在<a target="_blank" href="http://www.ineeke.com/archives/javascript-variable-scope/">JavaScript变量作用域</a>一文完全基于JavaScript代码词汇结构的定义：全局变量有全局作用域，函数中声明的变量拥有局部作用域。如果一个函数被嵌套在另一个函数中定义，那么该函数中声明的变量就有嵌套的局部作用域。]]></description>
			<content:encoded><![CDATA[<p>在<a target="_blank" href="http://www.ineeke.com/archives/javascript-variable-scope/">JavaScript变量作用域</a>一文完全基于JavaScript代码词汇结构的定义：全局变量有全局作用域，函数中声明的变量拥有局部作用域。如果一个函数被嵌套在另一个函数中定义，那么该函数中声明的变量就有嵌套的局部作用域。现在，我们知道全局变量是全局对象的属性，局部变量是特殊的call对象的属性，可以回顾并思考一下。对作用域的新的描述让我们对JavaScript变量在各种情况下有了新的思考，对其工作原理有了新的理解。<br />
每一个JavaScript执行上下文都有一个作用域链与之关联。这个作用域链是一个列表或者一个链对象集合。当JavaScript代码需要查找一个变量neeke的值时（一个被称为变量名解析的进程），它便开始从链表中的第一个对象查起。如果当前的对象拥有一个属性neeke，那么该属性的值将被使用并停止查询。如果第一个对象没有属性neeke，JavaScript将继续查询下一个对象。如果第二个对象也没有属性neeke，接着查询下一个对象，如此循环下去。<br />
在顶级JavaScript代码中（不被包含在任何函数中），作用域链只关联一个对象全局对象。所有的变量都在该对象中查询。如果某一个变量不存在，那么这个变量就是undefined。在一个非嵌套的函数中，无论如何，作用域链中都关联两个对象。第一个对象是函数的call对象，第二个是全局对象。当该函数引用一个变量时，call对象第一个被检查，其次是全局对象。一个嵌套函数可能有三个到三个以上的对象在它的作用域链中，下图说明它的查找过程。<br />
<a href="http://img.ineeke.com/2010/04/The-scope-chain-and-variable-resolution.bmp" class="highslide-image" onclick="return hs.expand(this);"><img src="http://img.ineeke.com/2010/04/The-scope-chain-and-variable-resolution.bmp" alt="The scope chain and variable resolution" title="The scope chain and variable resolution" class="aligncenter size-full wp-image-1190" /></a></p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月6日 -- <a href="http://www.ineeke.com/archives/variables-as-properties/" title="JavaScript变量与对象属性">JavaScript变量与对象属性</a><br /><small>你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/variable-scope-revisited/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript变量与对象属性</title>
		<link>http://www.ineeke.com/archives/variables-as-properties/</link>
		<comments>http://www.ineeke.com/archives/variables-as-properties/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 07:42:46 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/variables-as-properties/</guid>
		<description><![CDATA[你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的方式被赋值，以同样的JavaScript表达式来使用，等等。难道变量i与对象o的属性i之间真的不存在任何根本性差异吗？答案是，JavaScript中的变量与属性从根本上都是一致的。]]></description>
			<content:encoded><![CDATA[<blockquote><p>声明：本文系本人为学习英语及JavaScript基础而翻译《JavaScript The Definitive Guide》第五版，均为个人理解，略有删改，切勿完全信以为真，走火入魔。因本文引起的一切后果，读者自负，与本人无关。</p></blockquote>
<p>你很可能已经注意到JavaScript的变量和对象属性有很多相似处。它们以同样的方式被赋值，以同样的JavaScript表达式来使用，等等。难道变量i与对象o的属性i之间真的不存在任何根本性差异吗？答案是，JavaScript中的变量与属性从根本上都是一致的。<br />
<strong>JavaScript全局对象</strong><br />
当JavaScript解释器启动时，在它执行任何JavaScript代码之前，它都要创建一个全局对象。这个对象的属性是JavaScript程序的全局变量。当你声明一个JavaScript全局变量时，实际上你是在这个全局对象上定义了一个属性。<br />
JavaScript解释器在初始化这个全局对象的同时也初始化了一些预定义的成员。<br />
在客户端JavaScript中，Window对象作为全局对象，是所有JavaScript代码的容器。这个全局Window对象拥有一个自引用属性window，可以被用来代替this。Window对象定义了核心全局成员，例如parseInt，Math，navigator等。<br />
<strong>局部变量：call对象</strong><br />
如果全局变量是特殊全局变量（Window）的属性，那么局部变量呢？它们也同样是一个对象的属性。这个对象就是call对象。call对象的生命周期比全局对象要短，但是它的用途是一样的。当函数体被执行时，函数的所有参数及局部变量都将被作为call对象的属性存储起来。当作一个完全独立的对象使用可以允许JavaScript防止局部变量复写同名全局变量。<br />
<strong>JavaScript执行上下文</strong><br />
每当JavaScript解释器开始执行一个函数时，它都会为其创建一个新的函数执行上下文。一个执行上下文就是任何一段JavaScript代码在执行时的环境（感觉有点绕口）。上下文中重要的一部分就是变量的定义。每一个JavaScript函数以及它的call对象都运行在它自己独有的执行上下文中。<br />
有趣的一点是，JavaScript的实现允许多个全局执行上下文对应多个不同的全局对象。显而易见的例子就是客户端JavaScript，每一个浏览器窗口或者窗口中的任何一个框架，都有其自己的全局执行上下文。客户端的窗口或者任何一个框架中的JavaScript代码都运行在它们自己的执行上下文中，并且拥有自己的全局对象。而且，这些独立的全局对象都有一个属性将它们互相联系起来，JavaScript代码中，一个框架来源于另一个框架的表达式为：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">parent.<span style="color: #660066;">frames</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span></pre></div></div>

<p>在第二个框架中可以通过如下表达式访问第一个框架中的全局变量neeke</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">parent.<span style="color: #660066;">frames</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">neeke</span></pre></div></div>

<p>我们不需要完全明白它们是如何联系起来的，而需要明白的是JavaScript是非常灵活的，能够在一个JavaScript解释器中执行不同全局执行上下文中的脚本，并且这些上下文之间是可以互相访问的。<br />
<span style="color: #ff0000;">最后需要考虑的一点。</span>当JavaScript代码在一个执行上下文中可以读写属性并且执行函数被定义在另一个执行上下文中时，复杂度太高，需要考虑安全性。以客户端JavaScript为例。假设窗口A正在执行一段脚本或者包含有你本地intranet信息，此时窗口B正在执行一段来自Internet上一未知站点的脚本。一般而言，你并不希望B中的代码能够访问A中的属性。反之，B就能够访问并偷取敏感信息。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/variables-as-properties/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JavaScript变量作用域</title>
		<link>http://www.ineeke.com/archives/javascript-variable-scope/</link>
		<comments>http://www.ineeke.com/archives/javascript-variable-scope/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 01:01:32 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/javascript-variable-scope/</guid>
		<description><![CDATA[变量的作用域取决于它在程序中被定义时的位置。一个全局变量就有全局作用域；它在你的JavaScript代码的任何地方都是可见的。换句话说，被声明在函数体中的变量，它只存活于该函数体中，它是局部变量，作用域也是局部的。函数参数也同样是局部变量，被定义在函数体中。]]></description>
			<content:encoded><![CDATA[<blockquote><p>
声明：本文系本人为学习英语及JavaScript基础而翻译《JavaScript The Definitive Guide》第五版，均为个人理解，略有删改，切勿完全信以为真，走火入魔。因本文引起的一切后果，读者自负，与本人无关。
</p></blockquote>
<p>变量的作用域取决于它在程序中被定义时的位置。一个全局变量就有全局作用域；它在你的JavaScript代码的任何地方都是可见的。换句话说，被声明在函数体中的变量，它只存活于该函数体中，它是局部变量，作用域也是局部的。函数参数也同样是局部变量，被定义在函数体中。<br />
在函数体中，一个局部变量能够覆盖掉与它同名的全局变量。如果在全局变量中存在与你的函数参数名或局部变量相同的变量，那么全局变量将被隐藏。下面的代码将输出“local”：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'global'</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//声明一个全局变量</span>
<span style="color: #003366; font-weight: bold;">function</span> checkScope<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'local'</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//声明一个同名局部变量</span>
	document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>scope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//输出的是局部变量，而不是全局变量</span>
<span style="color: #009900;">&#125;</span>
checkScope<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//输出“local”</span></pre></div></div>

<p>尽管你可以在写代码时候不使用var关键字来声明全局变量，但是你最好使用var来声明局部变量。考虑一下这种情况下会发生什么事情：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'global'</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//声明一个全局变量</span>
<span style="color: #003366; font-weight: bold;">function</span> checkScope<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'local'</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//注意！我们修改了全局变量</span>
	document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>scope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//使用的是全局变量</span>
	myscope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'local'</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//这里声明了一个新的全局变量</span>
	document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>myscope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//使用新的全局变量</span>
<span style="color: #009900;">&#125;</span>
checkScope<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//输出“locallocal”</span>
document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>scope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//输出“local”</span>
document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>myscope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//输出“local”</span></pre></div></div>

<p>通常，函数中我们并不知道有哪些变量被定义在全局作用域中或者它们是被用来做什么的。如此，一个函数使用了一个全局变量，很可能会改变它在另一部分程序中的值。解决这一问题的方法其实很简单，那就是所有的变量都通过var来声明。<br />
函数可以嵌套使用，每一个函数都有其自己的局部作用域，所以，很有可能存在作用域的嵌套。例如：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'global scope'</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//一个全局变量</span>
<span style="color: #003366; font-weight: bold;">function</span> checkScope<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'local scope'</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//一个局部变量</span>
	<span style="color: #003366; font-weight: bold;">function</span> nested<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'nested scope'</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//一个嵌套的局部变量</span>
		document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>scope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//输出“nested scope”</span>
	<span style="color: #009900;">&#125;</span>
	nested<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
checkScope<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>与C,C++及JAVA等所不同的是，JavaScript不存在区块级作用域。无论在函数种的任何地方声明变量，它们都将被定义在整个函数之中。在下面的代码中，变量i,j及k都有同样的作用域：三个都被定义在整个函数之中。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> test<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//i被定义在整个函数之中</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">==</span> <span style="color: #3366CC;">'object'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> j <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//j被定义在所有地方，不仅仅是if区块内</span>
		<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> k <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>	<span style="color: #006600; font-style: italic;">//k被定义在所有地方，不仅仅是在循环中</span>
			document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>k<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//k依旧被定义，输出10</span>
	<span style="color: #009900;">&#125;</span>
	document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//j依旧被定义，但很可能未被初始化</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这种情况会产生意想不到的结果，下面的代码将会告诉你：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'global'</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">function</span> f<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>scope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//显示“undefined”，而不是“global”</span>
	<span style="color: #003366; font-weight: bold;">var</span> scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'local'</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//变量在此被初始化，但被定义在所有地方</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>scope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//显示“local”</span>
<span style="color: #009900;">&#125;</span>
f<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>你很可能在想第一次调用aler()的时候应该显示“global”，因为var声明的局部变量语句此时还未执行。然而，由于作用域规则，它与你所想的截然不同。这个局部变量被定义在整个函数之中，也就是说，同名的全局变量被隐藏了。虽然这个局部变量被定义在整个函数之中，但是由于它此时的确还未通过执行var语句来初始化。因此，上面的代码实际上等同于下面的代码：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> f<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> scope<span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//局部变量在函数开始处被声明</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>scope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//此时变量存在，但是它的值依旧是“underfined”</span>
	scope <span style="color: #339933;">=</span> <span style="color: #3366CC;">'local'</span><span style="color: #339933;">;</span>	<span style="color: #006600; font-style: italic;">//现在我们初始化并赋予它值</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>scope<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		<span style="color: #006600; font-style: italic;">//现在它有值了</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>以上案例告诉我们，为什么说在编程时将所有的变量一起声明在函数的开始处是一个好的习惯。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/javascript-variable-scope/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavaScript原始数据类型包装对象</title>
		<link>http://www.ineeke.com/archives/primitive-datatype-wrapper-objects/</link>
		<comments>http://www.ineeke.com/archives/primitive-datatype-wrapper-objects/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 08:45:07 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/primitive-datatype-wrapper-objects/</guid>
		<description><![CDATA[JavaScript中的字符串有一些奇怪的特点：操作字符串时，可以使用对象操作符。先看一段简单的字符串操作代码：]]></description>
			<content:encoded><![CDATA[<blockquote><p>
声明：本文系本人为学习英语及JavaScript基础而翻译《JavaScript The Definitive Guide》第五版，均为个人理解，略有删改，切勿完全信以为真，走火入魔。因本文引起的一切后果，读者自负，与本人无关。
</p></blockquote>
<p>JavaScript中的字符串有一些奇怪的特点：操作字符串时，可以使用对象操作符。先看一段简单的字符串操作代码：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> s <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;http://www.ineeke.cn&quot;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> addr <span style="color: #339933;">=</span> s.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>s.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> s.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>如果你不是很了解，你会认为s是一个对象，可以调用它的方法并读取其属性值。<br />
出什么问题了呢？字符串是对象吗？或者它是原始数据类型？typeof操作符告诉我们字符串的类型为“string”，是与“object”类型完全不同的。那么，为什么字符串能够使用对象操作符呢？<br />
实际上，这三个主原始数据类型（数值，字符串及布尔）每一个都有其对应的对象类。JavaScript中不仅提供了数值型，字符串型及布尔型，它还提供了数值类，字符串类及布尔类。这些类将对应的原始数据类型包装了起来，它不但拥有其原始数据值，而且还定义了属性和操作值的方法。<br />
JavaScript能够很灵活的转换各种数据类型。当你访问一个字符串的属性或方法时，JavaScript内部会自动创建其包装对象。这个字符串包装对象将替换原始字符串值，它拥有已定义的属性和方法，所以这样的使用方法是正确的。<br />
谨记，只有当字符串被以对象的方式使用时，它的对象才会被创建，并且这个对象是临时性的。在访问了它的属性或方法之后，即不再被使用，它将被系统所回收。假设s是一个字符串，我们以下面的方式读取它的长度：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> len <span style="color: #339933;">=</span> s.<span style="color: #660066;">length</span><span style="color: #339933;">;</span></pre></div></div>

<p>那么，s依旧是一个字符串，原始字符串值本身没有发生改变。而一个新的临时性的字符串对象被创建了，它允许你访问length属性，接着，它被抛弃（回收）且不影响s的原始值。这种方式好像既优雅又错综复杂，通常情况下，这些都是JavaScript内部实现转换的，我们只需要了解，我们不必担心出问题。<br />
如果在你的程序中需要明确的创建一个非临时性的字符串对象，你只需要使用new关键字即可：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> s <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;www.ineeke.com&quot;</span><span style="color: #339933;">;</span><span style="color: #006600; font-style: italic;">//这是一个原始数据值</span>
<span style="color: #003366; font-weight: bold;">var</span> S <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> String<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'www.ineeke.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #006600; font-style: italic;">//这是一个字符串对象</span></pre></div></div>

<p>当你已经创建了字符串对象S，你能用它做些什么呢？对应的原始字符串值什么都不能做。typeof操作将告诉你S的确是一个字符串对象而不是字符串值，除了这种方式，你会发现你无法区分出字符串值和字符串对象。字符串在需要的时候会自动的转换为字符串对象。当你对S使用+运算符时，一个对应的原始字符串值将被创建，以便执行运算。<br />
记住，这里讨论的所有内容都同样作用于数值型和布尔型。最后一点，所有的数值，字符串及布尔都可以通过Object()函数转换成其对应的对象：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> number_wrapper <span style="color: #339933;">=</span> Object<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">22</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/primitive-datatype-wrapper-objects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>打印Ext组件中的内容</title>
		<link>http://www.ineeke.com/archives/print-the-contents-of-ext-components/</link>
		<comments>http://www.ineeke.com/archives/print-the-contents-of-ext-components/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 09:56:05 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[extjs]]></category>
		<category><![CDATA[extjs api]]></category>
		<category><![CDATA[extjs 布局]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/?p=1147</guid>
		<description><![CDATA[描述一下大概功能需求：从Ext的GridPanel中选择一条记录，将这条记录的详细信息呈现在Ext的Window当中，将Window中呈现的数据按其格式用打印机打印出来。]]></description>
			<content:encoded><![CDATA[<p>描述一下大概功能需求：从Ext的GridPanel中选择一条记录，将这条记录的详细信息呈现在Ext的Window当中，将Window中呈现的数据按其格式用打印机打印出来。<br />
要处理这个有两种方式：<br />
1.在前台用JavaScript调用打印机打印<br />
2.在后台服务器端处理<br />
由于需求的原因，这里只允许使用第一种方式。想来应该也不难，JavaScript调用一下window.print()（注意：不是Ext.Window），结果失败了。window.print()打印出来的是整个当前浏览器中所呈现的内容，而不是我所要的Ext.Window中的内容。<br />
（突然在想为什么不让每个dom都有print()方法去打印自身中的内容呢？郁闷&#8230;）<br />
既然只能打印浏览器window中的，那我把Ext.Window中要打印的内容赋给浏览器的window，不就可以打印了么。<br />
于是乎开始coding&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> win <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">Window</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
  title<span style="color: #339933;">:</span> <span style="color: #3366CC;">'明细'</span><span style="color: #339933;">,</span>
  width<span style="color: #339933;">:</span> <span style="color: #CC0000;">600</span><span style="color: #339933;">,</span>
  height<span style="color: #339933;">:</span> <span style="color: #CC0000;">400</span><span style="color: #339933;">,</span>
  buttons<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#123;</span>
    text<span style="color: #339933;">:</span> <span style="color: #3366CC;">'打印'</span><span style="color: #339933;">,</span>
    handler<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #006600; font-style: italic;">//把当前的页面存起来</span>
      <span style="color: #003366; font-weight: bold;">var</span> c <span style="color: #339933;">=</span> window.<span style="color: #660066;">document</span>.<span style="color: #660066;">body</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">;</span>
      <span style="color: #006600; font-style: italic;">//把win中要打印的内容赋给当前浏览器</span>
      window.<span style="color: #660066;">document</span>.<span style="color: #660066;">body</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> win.<span style="color: #660066;">body</span>.<span style="color: #660066;">dom</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">;</span>
      <span style="color: #006600; font-style: italic;">//开始打印</span>
      window.<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #006600; font-style: italic;">//再转回去</span>
      window.<span style="color: #660066;">document</span>.<span style="color: #660066;">body</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> c<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>先不说打印是否成功，由于整个项目是Ext做的，这样一来回折腾，整个页面直接变成只能看不能操作了，晕倒~再想办法吧。<br />
coding&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> win <span style="color: #339933;">=</span> window.<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'printer'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
win.<span style="color: #660066;">document</span>.<span style="color: #660066;">body</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> win.<span style="color: #660066;">body</span>.<span style="color: #660066;">dom</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">;</span>
win.<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>没问题，可是弹出来了一个窗口，我想能不能把它隐藏起来呢，可是突然又想到弹窗会被某些浏览器拦截，这个方法也放弃。<br />
还有什么办法呢？再次突然想起<a href="http://www.ineeke.com/archives/JavaScriptValueFromFrameToFrame/" target="_blank">frame与frame之间如何用JavaScript传值</a>，一个frame中含有一个window对象，那么&#8230;<br />
接着coding&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> win <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">Window</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
  title<span style="color: #339933;">:</span> <span style="color: #3366CC;">'明细'</span><span style="color: #339933;">,</span>
  width<span style="color: #339933;">:</span> <span style="color: #CC0000;">600</span><span style="color: #339933;">,</span>
  height<span style="color: #339933;">:</span> <span style="color: #CC0000;">400</span><span style="color: #339933;">,</span>
  html<span style="color: #339933;">:</span> <span style="color: #3366CC;">'&lt;iframe /&gt;'</span><span style="color: #339933;">,</span>
  buttons<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#123;</span>
    text<span style="color: #339933;">:</span> <span style="color: #3366CC;">'打印'</span><span style="color: #339933;">,</span>
    handler<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> c <span style="color: #339933;">=</span> win.<span style="color: #660066;">body</span>.<span style="color: #660066;">fist</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">dom</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">;</span>
      <span style="color: #003366; font-weight: bold;">var</span> printer <span style="color: #339933;">=</span> win.<span style="color: #660066;">body</span>.<span style="color: #660066;">last</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">dom</span>.<span style="color: #660066;">contentWindow</span><span style="color: #339933;">;</span>
      printer.<span style="color: #660066;">document</span>.<span style="color: #660066;">body</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> c<span style="color: #339933;">;</span>
      printer.<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>在Ext.Window中用html配置选项创建一个空iframe标签，在Firebug下可以看到html所配置的内容会出现在win.body中且位于最后，win.body是Ext.Element对象，通过它可以取到要打印的内容c和打印机printer(frame中的window)，然后赋值，接着打印。<br />
想的好好的，打印出来的竟然和第一个方式一样，⊙﹏⊙b汗<br />
问题出在哪了？难道因为iframe没有获得焦点？printer.print()之前加上printer.focus()，再打印一张出来，搞定！同理也可以打印Ext.Panel等。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2009年09月1日 -- <a href="http://www.ineeke.com/archives/ext-code-optimization-and-to-reduce-the-amount-of-coding/" title="Ext代码优化并减少编码量">Ext代码优化并减少编码量</a><br /><small>Ext做的项目里经常要将几个组件合起来做成一个具有某一功能的组件，而且这样的功能...</small></li><li>2009年12月17日 -- <a href="http://www.ineeke.com/archives/ext-datepicker-size-of-the-adaptive/" title="Ext DatePicker大小自适应">Ext DatePicker大小自适应</a><br /><small>不知道为什么Ext的DatePicker明明是有height和width配置选项...</small></li><li>2009年08月17日 -- <a href="http://www.ineeke.com/archives/ext-tabpanel-items-highly-adaptive-width/" title="Ext TabPanel items高度宽度自适应">Ext TabPanel items高度宽度自适应</a><br /><small>写Ext的时候经常会遇到一些莫名其妙，令人感到非常神奇的问题，甚至都没办法用语言...</small></li><li>2009年07月14日 -- <a href="http://www.ineeke.com/archives/ext-dataview-self-drag-drop/" title="Ext DataView自身拖拽">Ext DataView自身拖拽</a><br /><small>Ext的examples中有组件与组件之间的数据拖拽，可就是没找到组件自身中的数...</small></li><li>2009年06月17日 -- <a href="http://www.ineeke.com/archives/ext-desktop-model-can-not-be-completely/" title="Ext desktop无法完全模式化">Ext desktop无法完全模式化</a><br /><small>在桌面应用系统中，有时需要对当前打开的窗体模式化，即用户只能进行当前的操作，禁止...</small></li><li>2009年05月21日 -- <a href="http://www.ineeke.com/archives/extjs-desktop/" title="ExtJS desktop">ExtJS desktop</a><br /><small>接下来我可能要开发Windows了，而且还得用Ext来开发，呵呵O(∩_∩)O~...</small></li><li>2009年05月21日 -- <a href="http://www.ineeke.com/archives/extjs-gridpanel-dynamic-column/" title="ExtJS GridPanel动态列">ExtJS GridPanel动态列</a><br /><small>要实现动态更改GridPanel的列就必须先了解固定列是怎么弄出来的。GridP...</small></li><li>2009年05月18日 -- <a href="http://www.ineeke.com/archives/extjs-wrote-recently-in-some-of-the-problems-encountered/" title="最近在写ExtJS时遇到的一些问题">最近在写ExtJS时遇到的一些问题</a><br /><small>之前要我解决的那个东西，上个星期我已经搞定并交付了。开发期间遇到了一些问题，总结...</small></li><li>2009年05月11日 -- <a href="http://www.ineeke.com/archives/ext-dataview-paging-filter-query-drag/" title="Ext DataView分页+过滤+查询+拖拽">Ext DataView分页+过滤+查询+拖拽</a><br /><small>Seven说让先把另外两个问题放放，让我先完成如图所示的一个sample。
...</small></li><li>2009年02月23日 -- <a href="http://www.ineeke.com/archives/putgridpanelintotabpanel/" title="ExtJS将GridPanel放入TabPanel中">ExtJS将GridPanel放入TabPanel中</a><br /><small>完整的GridPanel也有了，我现在需要将它组装到后台管理中去。现在要求点击一...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/print-the-contents-of-ext-components/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ext代码优化并减少编码量</title>
		<link>http://www.ineeke.com/archives/ext-code-optimization-and-to-reduce-the-amount-of-coding/</link>
		<comments>http://www.ineeke.com/archives/ext-code-optimization-and-to-reduce-the-amount-of-coding/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 07:57:40 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[extjs]]></category>
		<category><![CDATA[extjs api]]></category>
		<category><![CDATA[extjs 布局]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ineeke.com/archives/ext-code-optimization-and-to-reduce-the-amount-of-coding/</guid>
		<description><![CDATA[Ext做的项目里经常要将几个组件合起来做成一个具有某一功能的组件，而且这样的功能组件会在很多地方以不同的形式被应用。例如一个带数据分页功能的Grid，就至少需要JsonStore（也会是其它的）、PagingToolbar及GridPanel这三个组件，它们所构成的组件是非常常用的，最大不同应该就是所要呈现的数据了。]]></description>
			<content:encoded><![CDATA[<p>Ext做的项目里经常要将几个组件合起来做成一个具有某一功能的组件，而且这样的功能组件会在很多地方以不同的形式被应用。例如一个带数据分页功能的Grid，就至少需要JsonStore（也会是其它的）、PagingToolbar及GridPanel这三个组件，它们所构成的组件是非常常用的，最大不同应该就是所要呈现的数据了。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #003366; font-weight: bold;">namespace</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Neeke.myext'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009966; font-style: italic;">/*一个由JsonStore、GridPanel及PagingToolbar构成的常用的GridPanel，优化代码并减少日后的代码书写量。*/</span>
Neeke.<span style="color: #660066;">myext</span>.<span style="color: #660066;">BaseGrid</span> <span style="color: #339933;">=</span> Ext.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span>Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">//是否服务器端排序</span>
  remoteSort<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">//数据源</span>
  storeURL<span style="color: #339933;">:</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">,</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">//字段</span>
  storeFields<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">//分页大小</span>
  pageSize<span style="color: #339933;">:</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span>
&nbsp;
  constructor<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>cfg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>cfg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
      Ext.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> cfg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">store</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">JsonStore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
      url<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">storeURL</span><span style="color: #339933;">,</span>
      root<span style="color: #339933;">:</span> <span style="color: #3366CC;">'data'</span><span style="color: #339933;">,</span>
      remoteSort<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">remoteSort</span><span style="color: #339933;">,</span>
      totalProperty<span style="color: #339933;">:</span><span style="color: #3366CC;">'totalCount'</span><span style="color: #339933;">,</span>
      fields<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">storeFields</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Neeke.<span style="color: #660066;">myext</span>.<span style="color: #660066;">BaseGrid</span>.<span style="color: #660066;">superclass</span>.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
&nbsp;
      store<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">store</span><span style="color: #339933;">,</span>
			bbar<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">PagingToolbar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
					pageSize<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">pageSize</span><span style="color: #339933;">,</span>
					store<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">store</span><span style="color: #339933;">,</span>
					displayInfo<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
					displayMsg<span style="color: #339933;">:</span> <span style="color: #3366CC;">'当前显示 {0} - {1} 条记录，共 {2} 条记录'</span><span style="color: #339933;">,</span>
					emptyMsg<span style="color: #339933;">:</span> <span style="color: #3366CC;">'暂无数据'</span>
			<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
  getSelected<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> sm <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getSelectionModel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>sm.<span style="color: #660066;">getCount</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">return</span> sm.<span style="color: #660066;">getSelected</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
&nbsp;
      Ext.<span style="color: #660066;">Msg</span>.<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'提示'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'请选择一条记录'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>那么，可以结合这三者构成一个基类（代码如上），抽取出此三者中需要动态修改的配置选项作为该基类的配置选项，如PagingToolbar中的displayMsg这样的配置选项在项目中一般都是风格统一的，所以可以将其写“死”，如此一来，创建一个带分页的GridPanel就简单的多了。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> grid <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Neeke.<span style="color: #660066;">myext</span>.<span style="color: #660066;">BaseGrid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
  columns<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
&nbsp;
    <span style="color: #009900;">&#123;</span>header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'批次号'</span><span style="color: #339933;">,</span> dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'orbano'</span><span style="color: #339933;">,</span> menuDisabled<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span> sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span>header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'渠道商'</span><span style="color: #339933;">,</span> dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'channame'</span><span style="color: #339933;">,</span> menuDisabled<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span> sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
  viewConfig<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>forceFit<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
  storeURL<span style="color: #339933;">:</span> <span style="color: #3366CC;">'batchOrder.do?method=getBatchOrderList'</span><span style="color: #339933;">,</span>
  pageSize<span style="color: #339933;">:</span> <span style="color: #CC0000;">22</span><span style="color: #339933;">,</span>
  remoteSort<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
  storeFields<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
&nbsp;
    <span style="color: #3366CC;">'orbaid'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'orbano'</span>
  <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>某些常用的方法也同样可以优化，如要获取当前选中的记录，之前可以这么做：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> record <span style="color: #339933;">=</span> grid.<span style="color: #660066;">getSelectionModel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getSelected</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>JavaScript中的对象每“.”一次就要查询一遍，项目中N个地方都用这种方式好吗？写起来不觉得长吗？且多数情况下还要判断是否有选中项并给出提示。所以这些常用的方法也可以封装在这个基类中，以后基于这个基类的扩展只需点一次即可。<br />
当然或许有比这更好的，仅为自己总结的一些想法。</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年01月8日 -- <a href="http://www.ineeke.com/archives/print-the-contents-of-ext-components/" title="打印Ext组件中的内容">打印Ext组件中的内容</a><br /><small>描述一下大概功能需求：从Ext的GridPanel中选择一条记录，将这条记录的详...</small></li><li>2009年12月17日 -- <a href="http://www.ineeke.com/archives/ext-datepicker-size-of-the-adaptive/" title="Ext DatePicker大小自适应">Ext DatePicker大小自适应</a><br /><small>不知道为什么Ext的DatePicker明明是有height和width配置选项...</small></li><li>2009年08月17日 -- <a href="http://www.ineeke.com/archives/ext-tabpanel-items-highly-adaptive-width/" title="Ext TabPanel items高度宽度自适应">Ext TabPanel items高度宽度自适应</a><br /><small>写Ext的时候经常会遇到一些莫名其妙，令人感到非常神奇的问题，甚至都没办法用语言...</small></li><li>2009年07月14日 -- <a href="http://www.ineeke.com/archives/ext-dataview-self-drag-drop/" title="Ext DataView自身拖拽">Ext DataView自身拖拽</a><br /><small>Ext的examples中有组件与组件之间的数据拖拽，可就是没找到组件自身中的数...</small></li><li>2009年06月17日 -- <a href="http://www.ineeke.com/archives/ext-desktop-model-can-not-be-completely/" title="Ext desktop无法完全模式化">Ext desktop无法完全模式化</a><br /><small>在桌面应用系统中，有时需要对当前打开的窗体模式化，即用户只能进行当前的操作，禁止...</small></li><li>2009年05月21日 -- <a href="http://www.ineeke.com/archives/extjs-desktop/" title="ExtJS desktop">ExtJS desktop</a><br /><small>接下来我可能要开发Windows了，而且还得用Ext来开发，呵呵O(∩_∩)O~...</small></li><li>2009年05月21日 -- <a href="http://www.ineeke.com/archives/extjs-gridpanel-dynamic-column/" title="ExtJS GridPanel动态列">ExtJS GridPanel动态列</a><br /><small>要实现动态更改GridPanel的列就必须先了解固定列是怎么弄出来的。GridP...</small></li><li>2009年05月18日 -- <a href="http://www.ineeke.com/archives/extjs-wrote-recently-in-some-of-the-problems-encountered/" title="最近在写ExtJS时遇到的一些问题">最近在写ExtJS时遇到的一些问题</a><br /><small>之前要我解决的那个东西，上个星期我已经搞定并交付了。开发期间遇到了一些问题，总结...</small></li><li>2009年05月11日 -- <a href="http://www.ineeke.com/archives/ext-dataview-paging-filter-query-drag/" title="Ext DataView分页+过滤+查询+拖拽">Ext DataView分页+过滤+查询+拖拽</a><br /><small>Seven说让先把另外两个问题放放，让我先完成如图所示的一个sample。
...</small></li><li>2009年02月23日 -- <a href="http://www.ineeke.com/archives/putgridpanelintotabpanel/" title="ExtJS将GridPanel放入TabPanel中">ExtJS将GridPanel放入TabPanel中</a><br /><small>完整的GridPanel也有了，我现在需要将它组装到后台管理中去。现在要求点击一...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/ext-code-optimization-and-to-reduce-the-amount-of-coding/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>frame与frame之间如何用JavaScript传值</title>
		<link>http://www.ineeke.com/archives/JavaScriptValueFromFrameToFrame/</link>
		<comments>http://www.ineeke.com/archives/JavaScriptValueFromFrameToFrame/#comments</comments>
		<pubDate>Sun, 05 Oct 2008 16:00:26 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[javascript window]]></category>
		<category><![CDATA[JavaScript 的值]]></category>
		<category><![CDATA[JavaScript 表达式]]></category>

		<guid isPermaLink="false">http://ineeke.com/archives/frame%e4%b8%8eframe%e4%b9%8b%e9%97%b4%e5%a6%82%e4%bd%95%e7%94%a8javascript%e4%bc%a0%e5%80%bc/</guid>
		<description><![CDATA[<p>这个依然是为我的项目而服务的，因为项目的功能需要此技术来实现，或许对很多人来说这个不难，可是对我这个不太对JavaScript感冒的人来说就不是那么容易了，办法只有一个：找资料现学呗。</p>
]]></description>
			<content:encoded><![CDATA[<p>这个依然是为我的项目而服务的，因为项目的功能需要此技术来实现，或许对很多人来说这个不难，可是对我这个不太对JavaScript感冒的人来说就不是那么容易了，办法只有一个：找资料现学呗。</p>
<p>先来了解一下相关知识：要实现框架中多窗体的不同元素的访问，则必须使用window对象中的Frames属性。Frames属性同样也是一个数组，它在父框架集中为每一个子框架设有一项。通过下标实现不同框架的访问:<br />parent.frames[Index1].docuement.forms[index2]<br />通过parent.frames.length确定窗口中窗体的数目。除了使用数组下标来访问窗体外还可以使用框架名和窗体名来实现各元素的访：<br />parent.framesName.document.getElementById()<br />OK，这么点资料就够用了，我们来小试一把。首先创建一个theFather.html，其代码如下：</p>
<div class="HighLighter" contenteditable="false" style="width: 650px; height: 152px">
<div class="dp-highlighter" contenteditable="false">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
<li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span></span></li>
<li><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span></li>
<li class="alt"><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>frame&nbsp;get&nbsp;Value&nbsp;test</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span></li>
<li><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span></li>
<li class="alt"><span class="tag">&lt;</span><span class="tag-name">iframe</span><span>&nbsp;</span><span class="attribute">frameborder</span><span>=</span><span class="attribute-value">&quot;1&quot;</span><span>&nbsp;</span><span class="attribute">height</span><span>=</span><span class="attribute-value">&quot;78&quot;</span><span>&nbsp;</span><span class="attribute">marginheight</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span>&nbsp;</span><span class="attribute">marginwidth</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span>&nbsp;</span><span class="attribute">scrolling</span><span>=</span><span class="attribute-value">&quot;no&quot;</span><span>&nbsp;</span><span class="attribute">width</span><span>=</span><span class="attribute-value">&quot;100%&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;theSon.html&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">iframe</span><span class="tag">&gt;</span></li>
<li><span class="tag">&lt;</span><span class="tag-name">h3</span><span class="tag">&gt;</span><span>这是theFather的文本框</span><span class="tag">&lt;/</span><span class="tag-name">h3</span><span class="tag">&gt;</span></li>
<li class="alt"><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;txtFather&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;txtFather&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span></li>
<li><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span></li>
</ol>
</div>
<div class="xml" contenteditable="false" style="display: none">
<pre>&lt;html&gt;&lt;head&gt;&lt;title&gt;frame get Value test&lt;/title&gt;&lt;/head&gt;&lt;iframe frameborder=&quot;1&quot; height=&quot;78&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; width=&quot;100%&quot; src=&quot;theSon.html&quot;&gt;&lt;/iframe&gt;&lt;h3&gt;这是theFather的文本框&lt;/h3&gt;&lt;input type=&quot;text&quot; name=&quot;txtFather&quot; id=&quot;txtFather&quot; /&gt;&lt;/html&gt;</pre>
</div>
<div contenteditable="false">
<link href="http://www.ineeke.com/admin/FCKeditor/editor/plugins/highlighter/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css" type="text/css" rel="stylesheet" /></div>
</div>
<p>&nbsp;</p>
<p>接下来创建theSon.html，其代码如下：</p>
<div class="HighLighter" contenteditable="false">
<div class="dp-highlighter" contenteditable="false">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
<li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span></span></li>
<li><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span></li>
<li class="alt"><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>the&nbsp;son&nbsp;frame</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span></li>
<li><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span class="tag">&gt;</span></li>
<li class="alt"><span>//此方法用于向其父文本框类赋值 </span></li>
<li><span>function&nbsp;setValue(){ </span></li>
<li class="alt"><span>&nbsp;&nbsp; </span></li>
<li><span>&nbsp;&nbsp;//获得子类文本框中的值 </span></li>
<li class="alt"><span>&nbsp;&nbsp;var&nbsp;</span><span class="attribute">sonValue</span><span>=</span><span class="attribute-value">document</span><span>.getElementById(&quot;txtSon&quot;).value; </span></li>
<li><span>&nbsp;&nbsp;//弹出信息，此处仅用于测试 </span></li>
<li class="alt"><span>&nbsp;&nbsp;alert(&quot;theSon的值为：&quot;+sonValue); </span></li>
<li><span>&nbsp;&nbsp;//向父类文本框赋值 </span></li>
<li class="alt"><span>&nbsp;&nbsp;parent.document.getElementById(&quot;txtFather&quot;)</span><span class="attribute">.value</span><span>=</span><span class="attribute-value">sonValue</span><span>; </span></li>
<li><span>} </span></li>
<li class="alt"><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span></li>
<li><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span></li>
<li class="alt"><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span></li>
<li><span class="tag">&lt;</span><span class="tag-name">h3</span><span class="tag">&gt;</span><span>这是theSon的文本框及按钮</span><span class="tag">&lt;/</span><span class="tag-name">h3</span><span class="tag">&gt;</span></li>
<li class="alt"><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;txtSon&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;txtSon&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span></li>
<li><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;button&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;btnSon&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;btnSon&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;提交&quot;</span><span>&nbsp;</span><span class="attribute">onclick</span><span>=</span><span class="attribute-value">&quot;setValue();&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span></li>
<li class="alt"><span class="tag">&lt;/</span><span class="tag-name">body</span><<br />
span class="tag">&gt;</span></li>
<li><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span></li>
</ol>
</div>
<div class="xml" contenteditable="false" style="display: none">
<pre>&lt;html&gt;&lt;head&gt;&lt;title&gt;the son frame&lt;/title&gt;&lt;script type=&quot;text/javascript&quot;&gt;//此方法用于向其父文本框类赋值function setValue(){    //获得子类文本框中的值  var sonValue=document.getElementById(&quot;txtSon&quot;).value;  //弹出信息，此处仅用于测试  alert(&quot;theSon的值为：&quot;+sonValue);  //向父类文本框赋值  parent.document.getElementById(&quot;txtFather&quot;).value=sonValue;}&lt;/script&gt;&lt;/head&gt;&lt;body&gt;&lt;h3&gt;这是theSon的文本框及按钮&lt;/h3&gt;&lt;input type=&quot;text&quot; name=&quot;txtSon&quot; id=&quot;txtSon&quot; /&gt;&lt;input type=&quot;button&quot; name=&quot;btnSon&quot; id=&quot;btnSon&quot; value=&quot;提交&quot; onclick=&quot;setValue();&quot; /&gt;&lt;/body&gt;&lt;/html&gt;</pre>
</div>
<div contenteditable="false">
<link href="http://www.ineeke.com/admin/FCKeditor/editor/plugins/highlighter/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css" type="text/css" rel="stylesheet" /></div>
</div>
<p>&nbsp;</p>
<p>接下来运行测试，达到了预期的效果，现在可以正式融入项目中了。</p>
<p>&nbsp;</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2008年05月8日 -- <a href="http://www.ineeke.com/archives/html-javascript/" title="在HTML中植入JavaScript">在HTML中植入JavaScript</a><br /><small>您可以简单地象下面的语句一样植入一个 JavaScript 脚本：&lt;SCR...</small></li><li>2008年04月28日 -- <a href="http://www.ineeke.com/archives/399/" title="JavaScript 的值">JavaScript 的值</a><br /><small>JavaScript 承认以下几种值：    数值：例如85或3.1415等； ...</small></li><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/JavaScriptValueFromFrameToFrame/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>javascript对象模型</title>
		<link>http://www.ineeke.com/archives/javascript-model/</link>
		<comments>http://www.ineeke.com/archives/javascript-model/#comments</comments>
		<pubDate>Thu, 08 May 2008 01:05:58 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://ineeke.com/archives/javascript%e5%af%b9%e8%b1%a1%e6%a8%a1%e5%9e%8b/</guid>
		<description><![CDATA[<p>基于类的面向对象的语言，如 Java 和 C++，建立于两个不同的实体概念之上：类（classes）和实例（instances）。 一个类定义所有的描述对象集合的属性（如 Java 中的方法的域，以及 C++ 中的成员及属性），它是个抽象的东西，不象对象所描述的特定成员； 一个实例是类的实际表现（题外话：如果您了解 FLASH 的话，那么这好象是 Symbol 和 Instance 的关系），即是它的成员。</p>
]]></description>
			<content:encoded><![CDATA[<p>基于类的面向对象的语言，如 Java 和 C++，建立于两个不同的实体概念之上：类（classes）和实例（instances）。 一个类定义所有的描述对象集合的属性（如 Java 中的方法的域，以及 C++ 中的成员及属性），它是个抽象的东西，不象对象所描述的特定成员； 一个实例是类的实际表现（题外话：如果您了解 FLASH 的话，那么这好象是 Symbol 和 Instance 的关系），即是它的成员。</p>
<p>&nbsp;　　基于原型的语言如 JavaScript，没有这种区别，它只具有对象。一个基于原型的语言具有原型对象的概念，一个对象是一个模板，它为一个新对象提供最初的属性。任何对象都可以指定它自己的属性，不管是您创建的还是在运行时的。另外，任何对象都可以同另一个对象联合为一个原型，允许第二个对象分享第一个对象的属性。 定义一个类　　在基于类的语言中，类的定义是在一个单独的类定义中进行，在类定义中您可以指定其特有的方法，称为构造函数来创建类的实例。一个构造函数可以为实例的属性指定初始值并在其创建时执行其它初始化工作。您可以用 new 操作符来动态地用构造函数创建类的实例。</p>
<p>　　JavaScript 具有类似的模型，但没有与构造函数分离的类定义，而是定义一个构造函数来创建具有特定属性及其值的集合的对象。任何 JavaScript 函数都可以用作构造函数，您可以用 new 运算符和构造函数来创建一个新对象。 子类和继承　　在一个基于类的语言，您可以通过类定义创建一个类的层次；在类定义中，您可以指定一个新类是一个已存在的类的子类。子类继承了父类的所有属性并可以有自己特定的新属性或修改它继承的属性。例如辅乳动物类有两个属性：会移动、会产子，而它的子类猫类又有一个新属性，它会&ldquo;喵喵&rdquo;叫，那么猫类就有三个属性：会移动、会产子、会&ldquo;喵喵&rdquo;叫。</p>
<p>　　JavaScript 同样具有继承性，它允许您用构造函数来关联原型，但它与上例又有所不同，以上例的辅乳类来讲：首先您用构造函数定义辅乳动物，指定会移动、会产子两个属性；接下来定义猫构造函数，指定会&ldquo;喵喵&rdquo;叫这个属性，最后您为猫构造函数赋于一个新的辅乳动物对象，这时您就创建了一个新的猫对象，它继承了辅乳动物的两个属性。 添加和删除属性　　在基于类的语言中，您是在编译时创建一个类，而在编译时或运行时来实例化一个类的实例。当定义了类后您不能再改变类属性的数目和类型。而在 JavaScript 中，您可以在运行时从任何对象中添加或删除属性，如果您为对象集合原型的一个对象添加了一个属性，那么该原型的所有对象同时获取了这个新属性。</p>
<p>总结基于类（Java）和基于原型（JavaScript）的对象体系比较 Java JavaScript 类和实例是不同的实体 所有对象都是实例 用类定义定义类，类的实例化用构造函数方法 用构造函数定义和创建对象集合 用 new 操作符创建一个对象 相同 用类定义来定义已存在的子类以构造一个对象的层次 用构造函数关联原型，并通过把对象赋予原型创建对象层次 通过类链来继承属性 通过原型链继承属性 类定义指定一个类中所有实例的属性，不能在运行时动态添加属性 构造函数或原型指定一套初始属性集合，可以动态地为单独对象或整个对象集合添加或删除属性</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/javascript-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在HTML中植入JavaScript</title>
		<link>http://www.ineeke.com/archives/html-javascript/</link>
		<comments>http://www.ineeke.com/archives/html-javascript/#comments</comments>
		<pubDate>Thu, 08 May 2008 01:04:26 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript 表达式]]></category>

		<guid isPermaLink="false">http://ineeke.com/archives/%e5%9c%a8html%e4%b8%ad%e6%a4%8d%e5%85%a5javascript/</guid>
		<description><![CDATA[<p>您可以简单地象下面的语句一样植入一个 JavaScript 脚本：</p><p>&#60;SCRIPT&#62;<br />　　JavaScript 语句...<br />&#60;/SCRIPT&#62;</p><p>指定语言及版本<br />　　因为在不同的浏览器版本中支持不同版本的 JavaScript，以及还有一些其它的脚本语言如：JScript、VBScript 等等，因此我们有必要在 &#60;SCRIPT&#62; 标记中使用 LANGUAGE 属性来指定您所用的脚本语言及其版本，这样当用户浏览器不支持该脚本语言时，&#60;SCRIPT&#62; &#60;/SCRIPT&#62;标记中的代码将会被忽略，如下：</p>
]]></description>
			<content:encoded><![CDATA[<p>您可以简单地象下面的语句一样植入一个 JavaScript 脚本：</p>
<p>&lt;SCRIPT&gt;<br />　　JavaScript 语句&#8230;<br />&lt;/SCRIPT&gt;</p>
<p>指定语言及版本<br />　　因为在不同的浏览器版本中支持不同版本的 JavaScript，以及还有一些其它的脚本语言如：JScript、VBScript 等等，因此我们有必要在 &lt;SCRIPT&gt; 标记中使用 LANGUAGE 属性来指定您所用的脚本语言及其版本，这样当用户浏览器不支持该脚本语言时，&lt;SCRIPT&gt; &lt;/SCRIPT&gt;标记中的代码将会被忽略，如下：</p>
<p>&lt;SCRIPT LANGUAGE=&quot;JavaScript1.2&quot;&gt;</p>
<p>下表为 JavaScript 和 Navigator 版本的关系</p>
<p>Navigator 版本&nbsp; 缺省的 JavaScript 版本&nbsp; 支持的 &lt;SCRIPT&gt; 标记&nbsp; <br />Navigator 2.0之前&nbsp; 不支持 JavaScript&nbsp; 无&nbsp; <br />Navigator 2.0&nbsp; JavaScript 1.0&nbsp; &lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt;&nbsp; <br />Navigator 3.0&nbsp; JavaScript 1.1&nbsp; &lt;SCRIPT LANGUAGE=&quot;JavaScript1.1&quot;&gt; 及之前&nbsp; <br />Navigator 4.0-4.05&nbsp; JavaScript 1.2&nbsp; &lt;SCRIPT LANGUAGE=&quot;JavaScript1.2&quot;&gt; 及之前&nbsp; <br />Navigator 4.06-4.5&nbsp; JavaScript 1.3&nbsp; &lt;SCRIPT LANGUAGE=&quot;JavaScript1.3&quot;&gt; 及之前&nbsp;</p>
<p>我们还可以用 HTML 的注释标记将 JavaScript 代码隐藏起来，而一个浏览器将会忽略它不认识的标记，这样 &lt;SCRIPT&gt; 和 &lt;/SCRIPT&gt; 标记都会被忽略，虽然那些不支持 &lt;SCRIPT&gt; 标记可能已经绝迹，您不必非得这样做，但这也是一个尊重用户的好习惯。</p>
<p>指定 JavaScript 代码文件<br />　　当然，我们也可以指定一个 JavaScript 源文件来代替在 HTML 文件中引用，这样您就可以在不同的 HTML 文件中引用相同的 JavaScript 源程序，如：</p>
<p>&lt;SCRIPT SRC=&quot;common.js&quot;&gt;&lt;/SCRIPT&gt;</p>
<p>一个外部的 JavaScript 文件不能包含任何 HTML 标记，它的内容只能是 JavaScript 代码。</p>
<p>在HTML属性值中使用 JavaScript 表达式<br />　　使用 JavaScript 实体（entities），您可以指定一个 JavaScript 表达式作为一个 HTML 属性的值，实体值是动态赋予的，这就是说，您可以创建更灵活的 HTML 结构，因为 HTML 元素的属性依赖于页内先前放置元素信息。您可能对 HTML 的字符实体有所了解&mdash;它用（&amp;）符后接一个名称并以分号（;）结束。如一个版权符号的字符实体为&mdash;&amp;copy; 等等。类似的，JavaScript 实体也用（&amp;）开始，以分号（;）结束，不同的是它以一个用大括号（{ }）封装的 JavaScript 表达式来代替其名称和数字。如，假设您定义了一个变量 barWidth，那么您可以将其用于水平标尺的宽度百分比属性中：</p>
<p>&lt;HR WIDTH=&quot;&amp;{barWidth};%&quot; ALIGN=&quot;LEFT&gt;</p>
<p>引号标记<br />　　当您在一个字符串直接量中需要一个引号字符时，那么用单引号（&#8217;）来将其与字符串直接量区分开来。如下例中的函数 bar 包含一个在双引号属性值中的字符串&ldquo;left&rdquo;：</p>
<p>function bar(widthPct) {<br />　　document.write(&quot; &lt;HR ALIGN=&#8217;left&#8217;,WIDTH=&quot; + widthPct + &quot;%&gt;&quot;)<br />}</p>
<p>又如：&lt;INPUT TYPE=&quot;button&quot; VALUE=&quot;Press Me&quot; onClick=&quot;myfunc(&#8216;astring&#8217;)&quot;&gt;</p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2008年10月6日 -- <a href="http://www.ineeke.com/archives/JavaScriptValueFromFrameToFrame/" title="frame与frame之间如何用JavaScript传值">frame与frame之间如何用JavaScript传值</a><br /><small>这个依然是为我的项目而服务的，因为项目的功能需要此技术来实现，或许对很多人来说这...</small></li><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/html-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript 的值</title>
		<link>http://www.ineeke.com/archives/399/</link>
		<comments>http://www.ineeke.com/archives/399/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 16:46:02 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript 的值]]></category>

		<guid isPermaLink="false">http://ineeke.com/archives/javascript-%e7%9a%84%e5%80%bc/</guid>
		<description><![CDATA[<p>JavaScript 承认以下几种值：</p><ol>    <li>数值：例如85或3.1415等；</li>    <li>逻辑（布尔）值：如 true 和 false；</li>    <li>字符串：如&#8220;您好&#8221;；</li>    <li>null：空值，它是 JavaScript 的保留值，因为 JavaScript 的大小写敏感性，因此它不同与如 Null 或 NULL 等其它变量；</li>    <li>undefined：值的顶级属性是未定义的，它也是一个保留值。</li></ol><p>　　JavaScript 是一种动态数据类型语言，也就是说，当您声明一个变量时不必指定数据的类型，当程序执行时它会自动将其转换为您所需要的类型。而当您在一个表达式中将一个字符串类型的值和数值型的值进行&#8220;+&#8221;运算时，JavaScript 会将数值转换为字符串，如下：</p><blockquote><p><code>x=&#34;The answer is&#34;+23　　 //将返回&#34;The answer is 23&#34;</code></p></blockquote><p>而在含别的运算符的语句中，却不会发生这种事情，如：</p><blockquote><p><code>x=&#34;23&#34;-2　　 //将返回21</code></p></blockquote>
]]></description>
			<content:encoded><![CDATA[<p>JavaScript 承认以下几种值：</p>
<ol>
<li>数值：例如85或3.1415等；</li>
<li>逻辑（布尔）值：如 true 和 false；</li>
<li>字符串：如&ldquo;您好&rdquo;；</li>
<li>null：空值，它是 JavaScript 的保留值，因为 JavaScript 的大小写敏感性，因此它不同与如 Null 或 NULL 等其它变量；</li>
<li>undefined：值的顶级属性是未定义的，它也是一个保留值。</li>
</ol>
<p>　　JavaScript 是一种动态数据类型语言，也就是说，当您声明一个变量时不必指定数据的类型，当程序执行时它会自动将其转换为您所需要的类型。而当您在一个表达式中将一个字符串类型的值和数值型的值进行&ldquo;+&rdquo;运算时，JavaScript 会将数值转换为字符串，如下：</p>
<blockquote><p><code>x=&quot;The answer is&quot;+23　　 //将返回&quot;The answer is 23&quot;</code></p>
</blockquote>
<p>而在含别的运算符的语句中，却不会发生这种事情，如：</p>
<blockquote><p><code>x=&quot;23&quot;-2　　 //将返回21</code></p>
</blockquote>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2008年10月6日 -- <a href="http://www.ineeke.com/archives/JavaScriptValueFromFrameToFrame/" title="frame与frame之间如何用JavaScript传值">frame与frame之间如何用JavaScript传值</a><br /><small>这个依然是为我的项目而服务的，因为项目的功能需要此技术来实现，或许对很多人来说这...</small></li><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/399/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>植入JavaScript</title>
		<link>http://www.ineeke.com/archives/398/</link>
		<comments>http://www.ineeke.com/archives/398/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 16:43:05 +0000</pubDate>
		<dc:creator>Neeke</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://ineeke.com/archives/%e6%a4%8d%e5%85%a5javascript/</guid>
		<description><![CDATA[<p><code><font style="font: 10pt Fixedsys; color: #000000">我在上一节曾经讲过，JavaScript&#160;只能在&#160;HTML&#160;脚本中才能得以执行；那么，如何在&#160;HTML&#160;语言中植入一个&#160;JavaScript&#160;脚本呢？一个完整的语句应象下面一样：<br /></font><font style="font: 10pt Fixedsys; color: #0a246a">&#60;</font><font style="font: 10pt Fixedsys; color: #000000">SCRIPT&#160;LANGUAGE</font><font style="font: 10pt Fixedsys; color: #0a246a">=</font><font style="font: 10pt Fixedsys; color: #808080">&#34;JavaScript&#34;</font><font style="font: 10pt Fixedsys; color: #0a246a">&#62;<br />&#60;!--<br />......<br /></font><font style="font: 10pt Comic Sans MS; color: #008000">//--&#62;<br /></font><font style="font: 10pt Fixedsys; color: #0a246a">&#60;/</font><font style="font: 10pt Fixedsys; color: #000000">SCRIPT</font><font style="font: 10pt Fixedsys; color: #0a246a">&#62;<br /></font><font style="font: 10pt Fixedsys; color: #000000">LANGUAGE&#160;指定了一个&#160;JavaScript&#160;语言，但现在您也可以不用写该属性，因为目前几乎所有的浏览器都将其设为缺省值。</font></code></p>
]]></description>
			<content:encoded><![CDATA[<p><code><font style="font: 10pt Fixedsys; color: #000000">我在上一节曾经讲过，JavaScript&nbsp;只能在&nbsp;HTML&nbsp;脚本中才能得以执行；那么，如何在&nbsp;HTML&nbsp;语言中植入一个&nbsp;JavaScript&nbsp;脚本呢？一个完整的语句应象下面一样：<br /></font><font style="font: 10pt Fixedsys; color: #0a246a">&lt;</font><font style="font: 10pt Fixedsys; color: #000000">SCRIPT&nbsp;LANGUAGE</font><font style="font: 10pt Fixedsys; color: #0a246a">=</font><font style="font: 10pt Fixedsys; color: #808080">&quot;JavaScript&quot;</font><font style="font: 10pt Fixedsys; color: #0a246a">&gt;<br />&lt;!--<br />......<br /></font><font style="font: 10pt Comic Sans MS; color: #008000">//--&gt;<br /></font><font style="font: 10pt Fixedsys; color: #0a246a">&lt;/</font><font style="font: 10pt Fixedsys; color: #000000">SCRIPT</font><font style="font: 10pt Fixedsys; color: #0a246a">&gt;<br /></font><font style="font: 10pt Fixedsys; color: #000000">LANGUAGE&nbsp;指定了一个&nbsp;JavaScript&nbsp;语言，但现在您也可以不用写该属性，因为目前几乎所有的浏览器都将其设为缺省值。一段&nbsp;JavaScript&nbsp;代码可以放置于&nbsp;HTML&nbsp;中的任意部位，但大多数情况下我们习惯将其放于&nbsp;</font><font style="font: 10pt Fixedsys; color: #0a246a">&lt;</font><font style="font: 10pt Fixedsys; color: #000000">HEAD</font><font style="font: 10pt Fixedsys; color: #0a246a">&gt;...&lt;/</font><font style="font: 10pt Fixedsys; color: #000000">HEAD</font><font style="font: 10pt Fixedsys; color: #0a246a">&gt;&nbsp;</font><font style="font: 10pt Fixedsys; color: #000000">区段中，因为一些代码可能需要在页面装载起始就开始运行。但您可以不必拘泥于这项规定，您愿意如何放置都可以，甚至于您可以在&nbsp;HTML&nbsp;外部装入一个&nbsp;JavaScript&nbsp;程序，如下例：<br /></font><font style="font: 10pt Fixedsys; color: #0a246a">&lt;</font><font style="font: 10pt Fixedsys; color: #000000">SCRIPT&nbsp;LANGUAGE</font><font style="font: 10pt Fixedsys; color: #0a246a">=</font><font style="font: 10pt Fixedsys; color: #808080">&quot;JavaScript&quot;&nbsp;</font><font style="font: 10pt Fixedsys; color: #000000">SRC</font><font style="font: 10pt Fixedsys; color: #0a246a">=</font><font style="font: 10pt Fixedsys; color: #808080">&quot;url&quot;</font><font style="font: 10pt Fixedsys; color: #0a246a">&gt;<br />......<br />&lt;/</font><font style="font: 10pt Fixedsys; color: #000000">SCRIPT</font><font style="font: 10pt Fixedsys; color: #0a246a">&gt;<br /></font><font style="font: 10pt Fixedsys; color: #000000">这里，url&nbsp;当然是一个外部的&nbsp;JavaScript&nbsp;程序，在&nbsp;Netscape&nbsp;承认以后缀名为&nbsp;</font><font style="font: 10pt Fixedsys; color: #0a246a">.</font><font style="font: 10pt Fixedsys; color: #000000">js&nbsp;的程序，而&nbsp;IE&nbsp;对这个要求就比较宽松，只要它符合&nbsp;MIME&nbsp;格式就行了。这样，如果我们有很多的页面需要该段程序，只需编写一个外部程序就可以在多个页面中进行调用，是不是很方便。在上例中，不知您是否注意到&nbsp;</font><font style="font: 10pt Fixedsys; color: #0a246a">&lt;!-&nbsp;-&nbsp;</font><font style="font: 10pt Fixedsys; color: #000000">和&nbsp;</font><font style="font: 10pt Fixedsys; color: #0a246a">-&nbsp;-&gt;&nbsp;</font><font style="font: 10pt Fixedsys; color: #000000">标记，它为那些不支持&nbsp;JavaScript&nbsp;的浏览器提供了一个忽略它的方法，而&nbsp;</font><font style="font: 10pt Comic Sans MS; color: #008000">//&nbsp;标记则是一段注释的开始。<br /></font></code></p>
<h2  class="related_post_title">或许你会对下面这些文章感兴趣：</h2><ul class="related_post"><li>2010年07月2日 -- <a href="http://www.ineeke.com/archives/switch-the-focus-by-enter-key-in-javascript/" title="JavaScript回车切换焦点">JavaScript回车切换焦点</a><br /><small>一般情况下，在一个form表单中如果存在一个input标签的type值为subm...</small></li><li>2010年06月23日 -- <a href="http://www.ineeke.com/archives/java-simulation-of-micro-bos-homepage-tencent-login-failed/" title="Java模拟腾讯微博的网页登录失败">Java模拟腾讯微博的网页登录失败</a><br /><small>想模拟腾讯微博的网页登录呢，结果没成功，暂时还没找到原因，我觉得应该没问题了啊，...</small></li><li>2010年04月26日 -- <a href="http://www.ineeke.com/archives/javascript-dynamic-clock/" title="JavaScript动态时钟">JavaScript动态时钟</a><br /><small>继续玩JavaScript CanvasRenderingContext2D。前...</small></li><li>2010年04月23日 -- <a href="http://www.ineeke.com/archives/draw-a-smile-face-with-javascript/" title="JavaScript绘制笑脸">JavaScript绘制笑脸</a><br /><small>可别看这张脸简单啊，你要知道这里面可是用了平面几何中的圆啊！（π值你能背到第几位...</small></li><li>2010年04月22日 -- <a href="http://www.ineeke.com/archives/scripted-drawing-by-canvasrenderingcontext2d-createradialgradient/" title="JavaScript CanvasRenderingContext2D在canvas上绘图">JavaScript CanvasRenderingContext2D在canvas上绘图</a><br /><small>看到旁边的图，如果要问是怎么画的，估计第一反应是Photoshop，其实这是用J...</small></li><li>2010年04月14日 -- <a href="http://www.ineeke.com/archives/build-your-own-javascript-libraries/" title="构建自己的JavaScript库">构建自己的JavaScript库</a><br /><small>外面有一批流行的JavaScript库，如jQuery、 ExtJS及Dojo等...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-closures/" title="JavaScript闭包">JavaScript闭包</a><br /><small>我们知道，在JavaScript中函数可以被嵌套，可以被用做数据，并且使用语法作...</small></li><li>2010年04月13日 -- <a href="http://www.ineeke.com/archives/javascript-function-scope/" title="JavaScript函数作用域链">JavaScript函数作用域链</a><br /><small>如JavaScript变量作用域一文所说，JavaScript函数体的执行是局部...</small></li><li>2010年04月12日 -- <a href="http://www.ineeke.com/archives/javascript-function-properties-and-methods/" title="JavaScript函数属性和方法">JavaScript函数属性和方法</a><br /><small>我们知道在JavaScript编程中，函数可以当作数据来使用。typeof运算符...</small></li><li>2010年04月8日 -- <a href="http://www.ineeke.com/archives/variable-scope-revisited/" title="JavaScript变量作用域回顾">JavaScript变量作用域回顾</a><br /><small>在JavaScript变量作用域一文完全基于JavaScript代码词汇结构的定...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ineeke.com/archives/398/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
