﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-GnillinG-随笔分类-Javascript</title><link>http://www.blogjava.net/gnilling/category/37846.html</link><description>&amp;nbsp&amp;nbsp&amp;nbsp The more you share, the more you get</description><language>zh-cn</language><lastBuildDate>Mon, 02 Mar 2009 17:07:20 GMT</lastBuildDate><pubDate>Mon, 02 Mar 2009 17:07:20 GMT</pubDate><ttl>60</ttl><item><title>JavaScript进行GET和POST请求</title><link>http://www.blogjava.net/gnilling/archive/2009/03/02/257442.html</link><dc:creator>Albert Ling</dc:creator><author>Albert Ling</author><pubDate>Mon, 02 Mar 2009 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/gnilling/archive/2009/03/02/257442.html</guid><wfw:comment>http://www.blogjava.net/gnilling/comments/257442.html</wfw:comment><comments>http://www.blogjava.net/gnilling/archive/2009/03/02/257442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gnilling/comments/commentRss/257442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gnilling/services/trackbacks/257442.html</trackback:ping><description><![CDATA[<span style="font-family: Times New Roman;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><![endif]-->
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
h1
{
mso-style-link:"标题 1 Char";
margin-right:0cm;
margin-left:0cm;
font-size:24.0pt;
font-family:宋体;}
span.1Char
{mso-style-name:"标题 1 Char";
mso-style-link:"标题 1";
font-family:宋体;
font-weight:bold;}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
<p>JavaScript<span style="font-family: 宋体;">进行</span>GET<span style="font-family: 宋体;">和</span>POST<span style="font-family: 宋体;">请求</span></p>
<p>Web<span style="font-family: 宋体;">上最常见的请求就是</span>GET<span style="font-family: 宋体;">请求</span>.<span style="font-family: 宋体;">每次在浏览器中输入</span>URL<span style="font-family: 宋体;">并打开也米纳市</span>,<span style="font-family: 宋体;">就是在向服务器发送一个</span>GET<span style="font-family: 宋体;">请求</span>.</p>
<p>GET<span style="font-family: 宋体;">请求：</span></p>
<p>GET<span style="font-family: 宋体;">请求的参数使用问号追加到</span>URL<span style="font-family: 宋体;">的结尾</span>,<span style="font-family: 宋体;">后米纳给这用</span>&amp;<span style="font-family: 宋体;">好连接起来的名称</span>/<span style="font-family: 宋体;">值</span>.<span style="font-family: 宋体;">例如</span>:</p>
<p>http://www.somewhere.com/page.php?name1=value1&amp;name2=value2&amp;name3=value3</p>
<p><span style="font-family: 宋体;">每个名称和值都是在编码后才能用在</span>URL<span style="font-family: 宋体;">中（在</span>javaScript<span style="font-family: 宋体;">中可以用</span>encodeURIComponent()<span style="font-family: 宋体;">进行编码）。</span>URL<span style="font-family: 宋体;">最大长度为</span>2048<span style="font-family: 宋体;">字符（</span>2KB<span style="font-family: 宋体;">）。问好后米纳的内容成为查询字符串，这些参数可以在服务器端的页面中读取。</span></p>
<p><span style="font-family: 宋体;">要用</span>XMLHTTP<span style="font-family: 宋体;">请求对象发送一个</span>GET<span style="font-family: 宋体;">请求。只需将</span>URL<span style="font-family: 宋体;">（包含所有的参数）传入</span>open()<span style="font-family: 宋体;">方法。同时第一个参数段设为</span>&#8221;get&#8221;:</p>
<p><span>oRequest.open(&#8220;get&#8221;,&nbsp;&#8220;http://www.somewhere.com/page.php?name=value&#8221;,
false);</span></p>
<p><span style="font-family: 宋体;">因为参数必须逐家到</span>URL<span style="font-family: 宋体;">的末尾，所以最好用一个函数来处理此细节：</span></p>
<p><span>Function
addURLParam(sURL, sParamName, sParamName){</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sURL += (sURL.indexOf(&#8220;?&#8221;) == -1 ? &#8220;?&#8221;
: &#8220;&amp;&#8221;);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sURL += encodeURIComponent(sParamName)
+ &#8220;=&#8221; + encodeURIComponent(sParamName);</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sURL;</p>
<p>}</p>
<p><span style="font-family: 宋体;">三个参数分别为：要添加的</span>URL<span style="font-family: 宋体;">，参数名称和参数值。</span></p>
<p>POST<span style="font-family: 宋体;">请求：</span></p>
<p>POST<span style="font-family: 宋体;">请求通常用于提交数据，比</span>GET<span style="font-family: 宋体;">请求可以发送更多的数据（大约</span>2GB<span style="font-family: 宋体;">）。</span></p>
<p><span style="font-family: 宋体;">构造</span>POST<span style="font-family: 宋体;">的请求参数的函数：</span></p>
<p><span>Function
addPostParam(sParams, sParamName, sParamValue){</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sParams.length&gt;0){sParams += &#8220;&amp;&#8221;};</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sParams
+encodeURIComponent(sParamName) + &#8220;=&#8221;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;+ encodeURIComponent(sParamName);</p>
<p>}</p>
<p><span style="font-family: 宋体;">接下来为了能使</span>POST<span style="font-family: 宋体;">请求的服务器端页面正确的解释有此函数构造的参数字符串，需要将</span>POST<span style="font-family: 宋体;">请求首部&#8220;</span>Content-Type<span style="font-family: 宋体;">&#8221;设置为&#8220;</span>application/x-www-urlencoded<span style="font-family: 宋体;">&#8221;，所以需要使用</span>setRequestHeader()<span style="font-family: 宋体;">方法设置这个首部：</span></p>
<p><span>var
sParams = &#8216; &#8216;;</span></p>
<p><span>sParams =
addPostParam();</span></p>
<p><span>oRequest.open(&#8220;post&#8221;,
&#8220;page.php&#8221;, false);</span></p>
<p><span>sRequest.setRequestHeader(&#8220;Content-Type&#8221;,
&#8220;application/x-www-form-urlencoded&#8221;);</span></p>
<p>sRequest.send(sParams);</p>
<p><span style="font-family: 宋体;">现在这个例子就可以像由浏览器中提交表单一样正常工作了。</span></p>
<h1 style="margin: 0cm 0cm 0.0001pt;"><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; font-weight: normal;">FORM</span><span style="font-size: 10.5pt; font-weight: normal;">中的</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; font-weight: normal;">get
post</span><span style="font-size: 10.5pt; font-weight: normal;">方法区别</span></h1>
<p>Form<span style="font-family: 宋体;">中的</span>get<span style="font-family: 宋体;">和</span>post<span style="font-family: 宋体;">方法，在数据传输过程中分别对应了</span>HTTP<span style="font-family: 宋体;">协议中的</span>GET<span style="font-family: 宋体;">和</span>POST<span style="font-family: 宋体;">方法。二者主要区别如下：</span><span> <br />
1</span><span style="font-family: 宋体;">、</span>Get<span style="font-family: 宋体;">是用来从服务器上获得数据，而</span>Post<span style="font-family: 宋体;">是用来向服务器上传递数据。</span><span> <br />
2</span><span style="font-family: 宋体;">、</span> Get<span style="font-family: 宋体;">将表单中数据的按照</span>variable=value<span style="font-family: 宋体;">的形式，添加到</span>action<span style="font-family: 宋体;">所指向的</span>URL<span style="font-family: 宋体;">后面，并且两者使用</span>&#8220;?&#8221;<span style="font-family: 宋体;">连接，而各个变量之间使用</span> &#8220;&amp;&#8221;<span style="font-family: 宋体;">连接；</span>Post<span style="font-family: 宋体;">是将表单中的数据放在</span>form<span style="font-family: 宋体;">的数据体中，按照变量和值相对应的方式，传递到</span>action<span style="font-family: 宋体;">所指向</span>URL<span style="font-family: 宋体;">。</span><span> <br />
3</span><span style="font-family: 宋体;">、</span> Get<span style="font-family: 宋体;">是不安全的，因为在传输过程，数据被放在请求的</span>URL<span style="font-family: 宋体;">中，而如今现有的很多服务器、代理服务器或者用户代理都会将请求</span>URL<span style="font-family: 宋体;">记录到日志文件中，然后</span>
<span style="font-family: 宋体;">放在某个地方，这样就可能会有一些隐私的信息被第三方看到。另外，用户也可以在浏览器上直接看到提交的数据，一些系统内部消息将会一同显示在用户面前。</span> Post<span style="font-family: 宋体;">的所有操作对用户来说都是不可见的。</span><span> <br />
4</span><span style="font-family: 宋体;">、</span>Get<span style="font-family: 宋体;">传输的数据量小，这主要是因为受</span>URL<span style="font-family: 宋体;">长度限制；而</span>Post<span style="font-family: 宋体;">可以传输大量的数据，所以在上传文件只能使用</span>Post<span style="font-family: 宋体;">（当然还有一个原因，将在后面的提到）。</span><span> <br />
5</span><span style="font-family: 宋体;">、</span>Get<span style="font-family: 宋体;">限制</span>Form<span style="font-family: 宋体;">表单的数据集的值必须为</span>ASCII<span style="font-family: 宋体;">字符；而</span>Post<span style="font-family: 宋体;">支持整个</span>ISO10646<span style="font-family: 宋体;">字符集。</span><span> <br />
6</span><span style="font-family: 宋体;">、</span>Get<span style="font-family: 宋体;">是</span>Form<span style="font-family: 宋体;">的默认方法。</span>
</p>
</span>
<img src ="http://www.blogjava.net/gnilling/aggbug/257442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gnilling/" target="_blank">Albert Ling</a> 2009-03-02 23:43 <a href="http://www.blogjava.net/gnilling/archive/2009/03/02/257442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript---5种调用函数的方法</title><link>http://www.blogjava.net/gnilling/archive/2009/02/26/256889.html</link><dc:creator>Albert Ling</dc:creator><author>Albert Ling</author><pubDate>Thu, 26 Feb 2009 12:12:00 GMT</pubDate><guid>http://www.blogjava.net/gnilling/archive/2009/02/26/256889.html</guid><wfw:comment>http://www.blogjava.net/gnilling/comments/256889.html</wfw:comment><comments>http://www.blogjava.net/gnilling/archive/2009/02/26/256889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gnilling/comments/commentRss/256889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gnilling/services/trackbacks/256889.html</trackback:ping><description><![CDATA[<span style="font-family: Times New Roman;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
<p><span style="font-family: 宋体;">一次又一次的</span>,<span style="font-family: 宋体;">我发现</span>,<span style="font-family: 宋体;">那些有</span>bug<span style="font-family: 宋体;">的</span>Javascript<span style="font-family: 宋体;">代码是由于没有真正理解</span>Javascript<span style="font-family: 宋体;">函数是如何工作而导致的</span>(<span style="font-family: 宋体;">顺便说一下</span>,<span style="font-family: 宋体;">许多那样的代码是我写的</span>).JavaScript<span style="font-family: 宋体;">拥有函数式编程的特性</span>, <span style="font-family: 宋体;">当我们选择面对它的时候</span>,<span style="font-family: 宋体;">这将成为我们前进的阻碍</span><span>.<br />
</span><span style="font-family: 宋体;">作为初学者</span>,<span style="font-family: 宋体;">我们来测试五种函数调用的方法</span>,<span style="font-family: 宋体;">从表面来看我们会认为那些函数与</span>C#<span style="font-family: 宋体;">中函数的作用非常相似</span>,<span style="font-family: 宋体;">但是我们一会儿可以看到还是有非常重要的不同的地方的</span>,<span style="font-family: 宋体;">忽视这些差异无疑会导致难于跟踪的</span>bug<span style="font-family: 宋体;">。</span><span>.<br />
</span><span style="font-family: 宋体;">首先让我们创建一个简单的函数</span>,<span style="font-family: 宋体;">这个函数将在将在下文中使用</span>,<span style="font-family: 宋体;">这个函数仅仅返回当前的</span>this<span style="font-family: 宋体;">的值和两个提供的参数</span>.</p>
<p><span><br />
&lt;script type="text/</span>javascript<span>"&gt;<br />
<span style="color: windowtext; text-decoration: none;">function</span>
makeArray(arg1, arg2){<br />
&nbsp;&nbsp;&nbsp; return [ this, arg1, arg2 ];<br />
}<br />
&lt;/script&gt;<br />
<br />
</span><span style="font-family: 宋体;">最常用的方法</span>,<span style="font-family: 宋体;">但不幸的</span>,<span style="font-family: 宋体;">全局的函数调用</span><span><br />
</span><span style="font-family: 宋体;">当我们学习</span>Javascript<span style="font-family: 宋体;">时，我们了解到如何用上面示例中的语法来定义函数。</span><span><br />
,</span><span style="font-family: 宋体;">我们也知道调用这个函数非常的简单</span>,<span style="font-family: 宋体;">我们需要做的仅仅是</span><span>:<br />
makeArray('one', 'two');<br />
// =&gt; [ window, 'one', 'two' ]<br />
<br />
</span><span style="font-family: 宋体;">等一等</span>,<span style="font-family: 宋体;">那个</span>Window<span style="font-family: 宋体;">对象在这里干嘛呢</span>,<span style="font-family: 宋体;">为何</span>this<span style="font-family: 宋体;">的值是它呢</span>,<span style="font-family: 宋体;">如果你以前没有停下来思考这个问题</span>,<span style="font-family: 宋体;">那么请和我一起来分析吧</span><span>,<br />
</span><span style="font-family: 宋体;">在</span> Javascript<span style="font-family: 宋体;">里</span>,<span style="font-family: 宋体;">我没有指特定的浏览器</span>,<span style="font-family: 宋体;">有一个全局的对象</span>, <span style="font-family: 宋体;">那些看起来散落在你的脚本里的每一行代码</span>(<span style="font-family: 宋体;">例如在一个对象外的声明</span>)<span style="font-family: 宋体;">其实都被写在了一个全局对象的上下文里</span>.<span style="font-family: 宋体;">在我们的例子中</span>,<span style="font-family: 宋体;">其实那个</span>makeArray <span style="font-family: 宋体;">函数可以说不是一个松散的全局函数</span>,<span style="font-family: 宋体;">而是全局对象的一个方法</span>, <span style="font-family: 宋体;">让我们返回来看浏览器</span>,<span style="font-family: 宋体;">在这个环境里它的全局对象被映射到</span>window<span style="font-family: 宋体;">对象</span>.<span style="font-family: 宋体;">让我们来证明一下</span><span>:<br />
alert( typeof window.methodThatDoesntExist );<br />
// =&gt; undefined<br />
alert( typeof window.makeArray);<br />
// =&gt; <span style="color: windowtext; text-decoration: none;">function</span><br />
<br />
</span><span style="font-family: 宋体;">所有的这些意味着我们之前调用</span> makeArray<span style="font-family: 宋体;">的方法是和下面调用的方法一样的</span><span><br />
window.makeArray('one', 'two');<br />
// =&gt; [ window, 'one', 'two' ]<br />
</span><span style="font-family: 宋体;">我说最普遍的调用方法是不幸的是因为它导致我们声明的函数默认是全局的</span>.<span style="font-family: 宋体;">我们都知道全局成员不是编程的最佳实践</span>.<span style="font-family: 宋体;">这在</span>JavaScript<span style="font-family: 宋体;">里是特别的正确</span>,<span style="font-family: 宋体;">在</span>JavaScript<span style="font-family: 宋体;">中避免使用全局的成员</span>,<span style="font-family: 宋体;">你是不会为之后悔的</span>.</p>
<p>JavaScript<span style="font-family: 宋体;">函数调用规则</span><span>1 <br />
</span><span style="font-family: 宋体;">在没有通过明确所有者对象而直接调用的函数中，如</span>myFunction()<span style="font-family: 宋体;">，将导致</span>this<span style="font-family: 宋体;">的值成为默认对象（浏览器中的窗口）。</span></p>
<p><strong><span style="font-family: 宋体;"><span style="font-size: 14pt;"><span style="font-size: 12pt;">函数调用</span></span></span></strong><span><br />
</span><span style="font-family: 宋体;">让我们现在创建一个简单的对象</span>,<span style="font-family: 宋体;">使用</span> makeArray<span style="font-family: 宋体;">函数作为它的一个方法</span>,<span style="font-family: 宋体;">我们将使用</span><span style="color: windowtext; text-decoration: none;">js</span>on<span style="font-family: 宋体;">的方式来声明一个对象</span>,<span style="font-family: 宋体;">我们也来调用这个方法</span><span><br />
//creating the <span style="color: windowtext; text-decoration: none;">object</span><br />
var arrayMaker = {<br />
&nbsp;&nbsp;&nbsp; someProperty: 'some value here',<br />
&nbsp;&nbsp;&nbsp; make: makeArray<br />
};<br />
<br />
//invoke the make() method<br />
arrayMaker.make('one', 'two');<br />
// =&gt; [ arrayMaker, 'one', 'two' ]<br />
// alternative syntax, using square brackets<br />
arrayMaker['make']('one', 'two');<br />
// =&gt; [ arrayMaker, 'one', 'two' ]<br />
<br />
</span><span style="font-family: 宋体;">看</span> <span style="font-family: 宋体;">到这里的不同了吧</span>,this<span style="font-family: 宋体;">的值变成了对象本身</span>.<span style="font-family: 宋体;">你可能会疑问原始的函数定义并没有改变</span>,<span style="font-family: 宋体;">为何它不是</span>window<span style="font-family: 宋体;">了呢</span>.<span style="font-family: 宋体;">好吧</span>,<span style="font-family: 宋体;">这就是函数在</span> JSavacript<span style="font-family: 宋体;">中传递的方式</span>,<span style="font-family: 宋体;">函数在</span>JavaScript<span style="font-family: 宋体;">里是一个标准的数据类型</span>,<span style="font-family: 宋体;">确切的说是一个对象</span>.<span style="font-family: 宋体;">你可以传递它们或者复制他们</span>.<span style="font-family: 宋体;">就好像整个函</span>
<span style="font-family: 宋体;">数连带参数列表和函数体都被复制</span>,<span style="font-family: 宋体;">且被分配给了</span> arrayMaker<span style="font-family: 宋体;">里的属性</span>make,<span style="font-family: 宋体;">那就好像这样定义一个</span><span> arrayMaker:<br />
var arrayMaker = {<br />
&nbsp;&nbsp;&nbsp; someProperty: 'some value here',<br />
&nbsp;&nbsp;&nbsp; make: <span style="color: windowtext; text-decoration: none;">function</span> (arg1, arg2) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return [ this, arg1, arg2 ];<br />
&nbsp;&nbsp;&nbsp; }<br />
};<br />
<br />
JavaScript</span><span style="font-family: 宋体;">函数调用规则</span>2 <span style="font-family: 宋体;">在一个使用方法调用语法</span>,<span style="font-family: 宋体;">像</span> obj.myFunction()<span style="font-family: 宋体;">或者</span> obj['myFunction'](),<span style="font-family: 宋体;">这时</span>this<span style="font-family: 宋体;">的值为</span><span>obj<br />
<br />
</span><span style="font-family: 宋体;">这是事件处理代码中</span>bug<span style="font-family: 宋体;">的主要源头</span>,<span style="font-family: 宋体;">看看这些例子</span><span><br />
&lt;input type="button" value="Button 1"
id="btn1"&nbsp; /&gt;<br />
&lt;input type="button" value="Button 2"
id="btn2"&nbsp; /&gt;<br />
&lt;input type="button" value="Button 3"
id="btn3"&nbsp; onclick="buttonClicked();"/&gt;<br />
<br />
&lt;script type="text/<span style="color: windowtext; text-decoration: none;">javascript</span>"&gt;<br />
<span style="color: windowtext; text-decoration: none;">function</span>
buttonClicked(){<br />
&nbsp;&nbsp;&nbsp; var text = (this === window) ? 'window' : this.id;<br />
&nbsp;&nbsp;&nbsp; alert( text );<br />
}<br />
var button1 = document.getElementById('btn1');<br />
var button2 = document.getElementById('btn2');<br />
<br />
button1.onclick = buttonClicked;<br />
button2.onclick = <span style="color: windowtext; text-decoration: none;">function</span>(){&nbsp;&nbsp; buttonClicked();&nbsp;&nbsp; };<br />
&lt;/script&gt;<br />
<br />
</span><span style="font-family: 宋体;">点</span> <span style="font-family: 宋体;">击第一个按钮将会显示</span>&#8221;btn&#8221;<span style="font-family: 宋体;">因为它是一个方法调用</span>,this<span style="font-family: 宋体;">为所属的对象</span>(<span style="font-family: 宋体;">按钮元素</span>) <span style="font-family: 宋体;">点击第二个按钮将显示</span>&#8221;window&#8221;<span style="font-family: 宋体;">因为</span><span>
buttonClicked</span><span style="font-family: 宋体;">是被直接调用的</span>(<span style="font-family: 宋体;">不像</span> obj.buttonClicked().) <span style="font-family: 宋体;">这和我们第三个按钮</span>,<span style="font-family: 宋体;">将事件处理函数直接放在标签里是一样的</span>.<span style="font-family: 宋体;">所以点击第三个按钮的结果是和第二个一样的</span><span>.<br />
</span><span style="font-family: 宋体;">使用像</span>jQuery<span style="font-family: 宋体;">的</span>JS<span style="font-family: 宋体;">库有这样的优点</span>,<span style="font-family: 宋体;">当在</span>jQuery<span style="font-family: 宋体;">里定义了一个事件处理函数</span>,JS<span style="font-family: 宋体;">库会帮助重写</span>this<span style="font-family: 宋体;">的值以保证它包含了当前事件源元素的引用</span><span>,<br />
<br />
//</span><span style="font-family: 宋体;">使用</span><span>jQuery<br />
$('#btn1').click( <span style="color: windowtext; text-decoration: none;">function</span>() {<br />
&nbsp;&nbsp;&nbsp; alert( this.id ); // jQuery ensures 'this' will be the
button<br />
});<br />
<br />
jQuery</span><span style="font-family: 宋体;">是如何重载</span>this<span style="font-family: 宋体;">的值的呢</span>?<span style="font-family: 宋体;">继续阅读</span></p>
<p><span>
</span><span style="font-family: 宋体;">另外两个</span>:apply()<span style="font-family: 宋体;">和</span><span>call()<br />
</span><span style="font-family: 宋体;">你越</span> <span style="font-family: 宋体;">多的使用</span>JavaScript<span style="font-family: 宋体;">的函数</span>,<span style="font-family: 宋体;">你就越多的发现你需要传递函数并在不同的上下文里调用他们</span>,<span style="font-family: 宋体;">就像</span>jQuery<span style="font-family: 宋体;">在事件处理函数里所做的一样</span>,<span style="font-family: 宋体;">你往往经</span>
<span style="font-family: 宋体;">常需要重置</span>this<span style="font-family: 宋体;">的值</span>.<span style="font-family: 宋体;">记住我告诉你的</span>,<span style="font-family: 宋体;">在</span>Javascript<span style="font-family: 宋体;">中函数也是对象</span>,<span style="font-family: 宋体;">函数对象包含一些预定义的方法</span>,<span style="font-family: 宋体;">其中有两个便是</span>apply()<span style="font-family: 宋体;">和</span> call(),<span style="font-family: 宋体;">我们可以使用它们来对</span>this<span style="font-family: 宋体;">进行重置</span><span>.<br />
var gasGuzzler = { year: 2008, model: 'Dodge Bailout' };<br />
makeArray.apply( gasGuzzler, [ 'one', 'two' ] );<br />
// =&gt; [ gasGuzzler, 'one' , 'two' ]<br />
makeArray.call( gasGuzzler,&nbsp; 'one', 'two' );<br />
// =&gt; [ gasGuzzler, 'one' , 'two' ]<br />
</span><span style="font-family: 宋体;">这两个方法是相似的</span>,<span style="font-family: 宋体;">不同的是后面的参数的不同</span>,Function.apply()<span style="font-family: 宋体;">是使用一个数组来传递给函数的</span>,<span style="font-family: 宋体;">而</span>Function.call()<span style="font-family: 宋体;">是将这些参数独立传递的</span>,<span style="font-family: 宋体;">在实践中你会发现</span>apply()<span style="font-family: 宋体;">在大多数情况下更方便</span><span>.<br />
<br />
JavaScript</span><span style="font-family: 宋体;">函数调用规则</span>3 <span style="font-family: 宋体;">如果我们想在不复制函数到一个方法而想重载</span>this<span style="font-family: 宋体;">的值的时候</span>,<span style="font-family: 宋体;">我们可以使用</span> myFunction.apply( obj ) <span style="font-family: 宋体;">或</span><span> myFunction.call(obj).<br />
<br />
</span><strong><span style="font-family: 宋体;"><span style="font-size: 14pt;"><span style="font-size: 12pt;"><strong><span style="font-family: 宋体;"><span style="font-size: 18pt;"><strong><span style="font-family: 宋体;"><span style="font-size: 14pt;"><span style="font-size: 12pt;"><strong><span style="font-family: 宋体;">构造器</span></strong></span></span></span></strong></span></span></strong></span></span></span></strong><span><br />
</span><span style="font-family: 宋体;">我不想深入研究在</span>Javascript<span style="font-family: 宋体;">中类型的定义</span>,<span style="font-family: 宋体;">但是在此刻我们需要知道在</span>Javascript<span style="font-family: 宋体;">中没有类</span>,<span style="font-family: 宋体;">而且任何一个自定义的类型需要一个初始化函数</span>,<span style="font-family: 宋体;">使用原型对象</span>(<span style="font-family: 宋体;">作为初始化函数的一个属性</span>)<span style="font-family: 宋体;">定义你的类型也是一个不错的主义</span>,<span style="font-family: 宋体;">让我们来创建一个简单的类型</span><span><br />
//</span><span style="font-family: 宋体;">声明一个构造器</span><span><br />
<span style="color: windowtext; text-decoration: none;">function</span>
ArrayMaker(arg1, arg2) {<br />
&nbsp;&nbsp;&nbsp; this.someProperty = 'whatever';<br />
&nbsp;&nbsp;&nbsp; this.theArray = [ this, arg1, arg2 ];<br />
}<br />
// </span><span style="font-family: 宋体;">声明实例化方法</span><span><br />
ArrayMaker.prototype = {<br />
&nbsp;&nbsp;&nbsp; someMethod: <span style="color: windowtext; text-decoration: none;">function</span>
() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alert( 'someMethod called');<br />
&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp; getArray: <span style="color: windowtext; text-decoration: none;">function</span>
() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.theArray;<br />
&nbsp;&nbsp;&nbsp; }<br />
};<br />
<br />
var am = new ArrayMaker( 'one', 'two' );<br />
var other = new ArrayMaker( 'first', 'second' );<br />
<br />
am.getArray();<br />
// =&gt; [ am, 'one' , 'two' ]<br />
<br />
</span><span style="font-family: 宋体;">一个非常重要并值得注意的是出现在函数调用前面的</span>new<span style="font-family: 宋体;">运算符</span>,<span style="font-family: 宋体;">没有那个</span>,<span style="font-family: 宋体;">你的函数就像全局函数一样</span>,<span style="font-family: 宋体;">且我们创建的那些属性都将是创建在全局对象上</span> (window),<span style="font-family: 宋体;">而你并不想那样</span>,<span style="font-family: 宋体;">另一个话题是</span>,<span style="font-family: 宋体;">因为在你的构造器里没有返回值</span>,<span style="font-family: 宋体;">所以如果你忘记使用</span>new<span style="font-family: 宋体;">运算符</span>,<span style="font-family: 宋体;">将导致你的一些变量被赋值为</span> undefined.<span style="font-family: 宋体;">因为这个原因</span>,<span style="font-family: 宋体;">构造器函数以大写字母开头是一个好的习惯</span>,<span style="font-family: 宋体;">这可以作为一个提醒</span>,<span style="font-family: 宋体;">让你在调用的时候不要忘记前面的</span>new<span style="font-family: 宋体;">运算符</span><span>.<br />
</span><span style="font-family: 宋体;">带着这样的小心</span>,<span style="font-family: 宋体;">初始化函数里的代码和你在其他语言里写的初始化函数是相似的</span>.this<span style="font-family: 宋体;">的值将是你将创建的对象</span><span>.<br />
Javascript</span><span style="font-family: 宋体;">函数调用规则</span>4 <span style="font-family: 宋体;">当你将函数用作初始化函数的时候</span>,<span style="font-family: 宋体;">像</span>MyFunction(),Javascript<span style="font-family: 宋体;">的运行时将把</span>this<span style="font-family: 宋体;">的值指定为新建的对象</span>.</p>
<p><strong><span style="font-family: 宋体;">总结</span></strong><span><br />
</span><span style="font-family: 宋体;">我希望理解各种函数调用方式的不同会使你的</span>Sjavacript<span style="font-family: 宋体;">代码远离</span>bugs,<span style="font-family: 宋体;">有些这样的</span>bug<span style="font-family: 宋体;">会确保你总是知道</span>this<span style="font-family: 宋体;">的值是避免他们第一步</span></p>
</span>
<img src ="http://www.blogjava.net/gnilling/aggbug/256889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gnilling/" target="_blank">Albert Ling</a> 2009-02-26 20:12 <a href="http://www.blogjava.net/gnilling/archive/2009/02/26/256889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>