<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[刘新修]]></title> 
<link>http://liuxinxiu.com:80/index.php</link> 
<description><![CDATA[刘新修的个人博客 (Liuxinxiu'S Blog)]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[刘新修]]></copyright>
<item>
<link>http://liuxinxiu.com:80/this/</link>
<title><![CDATA[关于Javascript的this]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[H5/JS/CSS]]></category>
<pubDate>Tue, 27 Sep 2016 08:54:58 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/this/</guid> 
<description>
<![CDATA[ 
	<div>this是Javascript语言的一个关键字，它是一个指针，根据不同情形下指向不同的对象，随着函数使用场合的不同，this的值会发生变化。</div><div>&nbsp;</div><div>记住一条：当function被作为method调用时，this指向调用对象。另外，JavaScript并不是OO的，而是object based的一种语言。之所以你会觉得this用起来混乱，是因为你还没理解JavaScript的诸如全局对象、event handler等一些机制。</div><div>&nbsp;</div><div>this指向变化通常有以下几种情形：</div><div>&nbsp;</div><div><span style="color: rgb(0, 0, 128);"><strong>情况一：纯粹的函数调用[作为method调用]</strong></span></div><div>&nbsp;</div><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">function</span><span> test()&#123;&nbsp;&nbsp;</span></span></li><li><span>　　<span class="keyword">this</span><span>.x = 1;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　alert(<span class="keyword">this</span><span>.x);&nbsp;&nbsp;</span></span></li><li><span>&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>test(); <span class="comment">// 1</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div>以上function属于全局性调用，因此this就代表全局对象Global，为了证明它指向window 我们在window下给设置一个变量并去掉内部的赋值:</div><div>&nbsp;</div><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span> x = 1;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">function</span><span> test()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　alert(<span class="keyword">this</span><span>.x); </span><span class="comment">//取window下的x</span><span>&nbsp;&nbsp;</span></span></li><li><span>&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>test(); <span class="comment">// 1</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li><span><span class="keyword">var</span><span> x = 1;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">function</span><span> test()&#123;&nbsp;&nbsp;</span></span></li><li><span>　　<span class="keyword">this</span><span>.x = 0; </span><span class="comment">//this指针依然是window，只是重新复制而已</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span>test();&nbsp;&nbsp;</span></li><li class="alt"><span>alert(x); <span class="comment">//0</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div><div><span style="color: rgb(0, 0, 128);"><strong>情况二：作为对象方法的调用</strong></span></div><div>&nbsp;</div><div>作为对象的方法调用时，这时this指针就指这个对象，而不是window！</div><div>&nbsp;</div><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">function</span><span> test()&#123;&nbsp;&nbsp;</span></span></li><li><span> 　alert(<span class="keyword">this</span><span>.x);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span><span class="keyword">var</span><span> o = &#123;&#125;;&nbsp;&nbsp;</span></span></li><li class="alt"><span>o.x = 1;&nbsp;&nbsp;</span></li><li><span>o.m = test;&nbsp;&nbsp;</span></li><li class="alt"><span>o.m(); <span class="comment">// 1</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div>为了验证以下此时this能不能指向window我们做如下改动：</div><div>&nbsp;</div><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span> x=</span><span class="string">'windowX'</span><span>;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">function</span><span> test()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span> 　alert(<span class="keyword">this</span><span>.x);&nbsp;&nbsp;</span></span></li><li><span>&#125;&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">var</span><span> o = &#123;&#125;;&nbsp;&nbsp;</span></span></li><li><span><span class="comment">//o.x = 1;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>o.m = test;&nbsp;&nbsp;</span></li><li><span>o.m(); <span class="comment">// undefined&nbsp;&nbsp;--&gt;可见this不可能指向window</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div><div><span style="color: rgb(0, 0, 128);"><strong>情况三 作为构造函数调用</strong></span></div><div>&nbsp;</div><div>所谓构造函数，就是通过这个函数生成一个新对象（object）。这时，this就指这个新对象。</div><div>&nbsp;</div><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">function</span><span> test()&#123;&nbsp;&nbsp;</span></span></li><li><span>　　<span class="keyword">this</span><span>.x = 1;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span><span class="keyword">var</span><span> o = </span><span class="keyword">new</span><span> test();&nbsp;&nbsp;</span></span></li><li class="alt"><span>alert(o.x); <span class="comment">// 1</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div>同样，为了验证以下此时this能不能指向window我们做如下改动：</div><div>&nbsp;</div><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span> x=</span><span class="string">'windowX'</span><span>;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">function</span><span> test()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp; <span class="keyword">this</span><span>.x = 1;&nbsp;&nbsp;</span></span></li><li><span>&#125;&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">var</span><span> o = </span><span class="keyword">new</span><span> test();&nbsp;&nbsp;</span></span></li><li><span>alert(o.x); <span class="comment">// 1&nbsp;&nbsp; --&gt;可见this不可能指向window</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>alert(x); <span class="comment">// windowX</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div><div><strong><span style="color: rgb(0, 0, 128);">情况四 apply调用</span></strong></div><div>&nbsp;</div><div>apply()是函数体的一个方法，它的作用是改变函数的调用对象，它的第一个参数就表示改变后的调用这个函数的对象。因此，this指的就是这第一个参数</div></div></div></div><div>&nbsp;</div><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span> x = </span><span class="string">'windowX'</span><span>;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">function</span><span> test()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　alert(<span class="keyword">this</span><span>.x);&nbsp;&nbsp;</span></span></li><li><span>&#125;&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">var</span><span> o=&#123;&#125;;&nbsp;&nbsp;</span></span></li><li><span>o.x = 1;&nbsp;&nbsp;</span></li><li class="alt"><span>o.m = test;&nbsp;&nbsp;</span></li><li><span>o.m.apply(); <span class="comment">//windowX m函数的apply更改了调用对象--&gt;window</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div><div>apply()的参数为空时，默认调用全局对象。因此，这时的运行结果为windowX，证明this指的是全局window对象。</div><div>&nbsp;</div><div>如果把最后一行代码修改为：</div><div>&nbsp;</div><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>o.m.apply(o); </span><span class="comment">//1 运行结果就变成了1，证明this又指向了默认的o对象</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div><strong><span style="color: rgb(0, 0, 128);">练习测试题：</span></strong></div><div>&nbsp;</div><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="comment">/******** this指针及变量提升的问题 ********/</span><span>&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">var</span><span> foo=</span><span class="string">'windowFoo'</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">function</span><span> main()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(foo);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">//第一个alert，一般规则是先查找当前内部变量有没有，有则取没有找上一层&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> foo = 2;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="keyword">this</span><span>.foo);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//第二个alert，</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.foo = 3;&#125;&nbsp;&nbsp;</span></span></li></ol></div><div><div>注明：首先说下window下直接调用main()方法 this==window</div><div>&nbsp;</div><div>测试1: var m1=main(); //作为普通函数调用或者直接调用main()</div><div>&nbsp;</div><div>第一个alert属于特殊情况，内部有同名变量存在且在后边定义，涉及到了变量提升，因此输出：undefined</div><div>&nbsp;</div><div>第二个alert属于查找this指针对象下的属性，this指针指向window固输出：windowFoo 而不是后边的3</div><div>&nbsp;</div><div>&nbsp;</div><div>测试1: var m2=new main();&nbsp;&nbsp;//作为构造函数实例化之后调用</div><div>&nbsp;</div><div>第一个alert 输出undefined因为构造函数实例化后this指向该对象，不会变化</div><div>&nbsp;</div><div>第二个alert 输出undefined因为this.foo被实例化对象继承后等同于增加一个属性方法，且在alert之后，因此输出：undefined</div></div></div><br/>Tags - <a href="http://liuxinxiu.com:80/tags/this/" rel="tag">this</a> , <a href="http://liuxinxiu.com:80/tags/apply/" rel="tag">apply</a>
]]>
</description>
</item><item>
<link>http://liuxinxiu.com:80/this/#blogcomment</link>
<title><![CDATA[[评论] 关于Javascript的this]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://liuxinxiu.com:80/this/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>