<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[刘新修]]></title> 
<link>http://pic1.liuxinxiu.com:80/index.php</link> 
<description><![CDATA[刘新修的个人博客 (Liuxinxiu'S Blog)]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[刘新修]]></copyright>
<item>
<link>http://pic1.liuxinxiu.com:80/JS_this/</link>
<title><![CDATA[深入理解javascript原型和闭包（10）——this]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[H5/JS/CSS]]></category>
<pubDate>Mon, 24 Aug 2015 06:08:26 +0000</pubDate> 
<guid>http://pic1.liuxinxiu.com:80/JS_this/</guid> 
<description>
<![CDATA[ 
	<p>其实，this的取值，分四种情况。我们来挨个看一下。</p><div>&nbsp;</div><div>在此再强调一遍一个非常重要的知识点：在函数中this到底取何值，是在函数真正被调用执行的时候确定的，函数定义的时候确定不了。因为this的取值是执行上下文环境的一部分，每次调用函数，都会产生一个新的执行上下文环境。</div><div>&nbsp;</div><div><strong>情况1：构造函数</strong></div><div>&nbsp;</div><div>所谓构造函数就是用来new对象的函数。其实严格来说，所有的函数都可以new一个对象，但是有些函数的定义是为了new一个对象，而有些函数则不是。另外注意，构造函数的函数名第一个字母大写（规则约定）。例如：Object、Array、Function等。</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> Foo()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.name=</span><span class="string">&quot;刘新修&quot;</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.year=1986;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>); </span><span class="comment">//Foo &#123;name: &quot;刘新修&quot;, year: 1986&#125;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span><span class="keyword">var</span><span> f1=</span><span class="keyword">new</span><span> Foo();&nbsp;&nbsp;</span></span></li><li class="alt"><span>console.log(f1.name); <span class="comment">//刘新修</span><span>&nbsp;&nbsp;</span></span></li><li><span>console.log(f1.year); <span class="comment">//1986</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div><a href="http://at.liuxinxiu.com/2015/08/image/jsthis_1.gif" target="_blank"><img src="http://at.liuxinxiu.com/2015/08/image/jsthis_1.gif" width="568" height="310" alt="" /></a></div><div>注意，<span style="color: rgb(255, 0, 0);"><strong>以上仅限new Foo()的情况</strong></span>，即Foo函数作为构造函数的情况。如果直接调用Foo函数，而不是new Foo()，情况就大不一样了, 那就是普通函数调用了:</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> Foo()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.name=</span><span class="string">&quot;刘新修&quot;</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.year=1986;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>); </span><span class="comment">//Window &#123;top: Window, location: Location, document: document, window: Window, external: Object&hellip;&#125;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;&nbsp;&nbsp;</span></li><li><span>Foo();&nbsp;&nbsp;</span></li></ol></div><div><div><a href="http://at.liuxinxiu.com/2015/08/image/jsthis_2.gif" target="_blank"><img src="http://at.liuxinxiu.com/2015/08/image/jsthis_2.gif" width="360" height="475" alt="" /></a></div><div>这种情况下this就是window，个人总结：this就是就近原则，谁近就是谁，不然就是window，另外有关于闭包的两个demo同时也便于大家理解this 代码如下：</div><div>&nbsp;</div><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> name=</span><span class="string">&quot;The Window&quot;</span><span>;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">var</span><span> object=&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　name:<span class="string">&quot;My Object&quot;</span><span>,&nbsp;&nbsp;</span></span></li><li><span>　　getNameFunc:<span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　　　<span class="keyword">return</span><span> </span><span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li><span>　　　　　　<span class="keyword">return</span><span> </span><span class="keyword">this</span><span>.name;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　　　&#125;;&nbsp;&nbsp;</span></li><li><span>　　&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span>alert(object.getNameFunc()()); <span class="comment">//返回The Window</span><span>&nbsp;&nbsp;</span></span></li></ol></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> name=</span><span class="string">&quot;The Window&quot;</span><span>;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">var</span><span> object=&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　name:<span class="string">&quot;My Object&quot;</span><span>,&nbsp;&nbsp;</span></span></li><li><span>　　getNameFunc:<span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　　　<span class="keyword">var</span><span> that=</span><span class="keyword">this</span><span>;&nbsp;&nbsp;</span></span></li><li><span>　　　　<span class="keyword">return</span><span> </span><span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　　　　　<span class="keyword">return</span><span> that.name;&nbsp;&nbsp;</span></span></li><li><span>　　　　&#125;;&nbsp;&nbsp;</span></li><li class="alt"><span>　　&#125;&nbsp;&nbsp;</span></li><li><span>&#125;;&nbsp;&nbsp;</span></li><li class="alt"><span><span class="comment">//alert(object.getNameFunc()()); //返回My Object 注：因为var that=this; 声明的为私有变量</span><span>&nbsp;&nbsp;</span></span></li><li><span>console.log((object.getNameFunc()())); <span class="comment">//返回My Object 注：因为var that=this; 声明的为私有变量</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div><div>**********************************************************************************************************************</div><div>&nbsp;</div><div><strong>情况2：函数作为对象的一个属性</strong></div><div>&nbsp;</div><div>如果函数作为对象的一个属性时，并且作为对象的一个属性被调用时，函数中的this指向该对象。</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> obj=&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;x:10,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;fn:<span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>);&nbsp;&nbsp; </span><span class="comment">//object &#123;fu:function,x:10&#125;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>.x); </span><span class="comment">//10</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span>obj.fn();&nbsp;&nbsp;</span></li></ol></div><div><div><a href="http://at.liuxinxiu.com/2015/08/image/jsthis_3.gif" target="_blank"><img src="http://at.liuxinxiu.com/2015/08/image/jsthis_3.gif" width="413" height="592" alt="" /></a></div><div>以上代码中，fn不仅作为一个对象的一个属性，而且的确是作为对象的一个属性被调用。结果this就是obj对象。</div><div>注意，如果fn函数不作为obj的一个属性被调用，会是什么结果呢？</div><div>&nbsp;</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> obj=&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;x:10,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;fn:<span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>);&nbsp;&nbsp; </span><span class="comment">//Window &#123;top: Window, location: Location, document: document, window: Window, external: Object&hellip;&#125;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>.x); </span><span class="comment">//如果this是window那this.x 自然就是 undefined</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span><span class="keyword">var</span><span> fn1=obj.fn;&nbsp;&nbsp;</span></span></li><li class="alt"><span>fn1();&nbsp;&nbsp;</span></li></ol></div><div><div><a href="http://at.liuxinxiu.com/2015/08/image/jsthis_4.gif" target="_blank"><img src="http://at.liuxinxiu.com/2015/08/image/jsthis_4.gif" width="654" height="477" alt="" /></a></div><div><strong>情况3：函数用call或者apply调用</strong></div><div>&nbsp;</div><div>当一个函数被call和apply调用时，this的值就取传入的对象的值。至于call和apply如何使用，不会的朋友可以去查查其他资料，本系列教程不做讲解。</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> obj=&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;x:10&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span><span class="keyword">var</span><span> fn=</span><span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>);&nbsp;&nbsp; </span><span class="comment">//Object &#123;x: 10&#125;</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>.x); </span><span class="comment">//10</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span>fn.call(obj);&nbsp;&nbsp;</span></li></ol></div><div><div><a href="http://at.liuxinxiu.com/2015/08/image/jsthis_5.gif" target="_blank"><img src="http://at.liuxinxiu.com/2015/08/image/jsthis_5.gif" width="389" height="416" alt="" /></a></div><div><strong>情况4：全局 &amp; 调用普通函数</strong></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>console.log(</span><span class="keyword">this</span><span>===window); </span><span class="comment">//true</span><span>&nbsp;&nbsp;</span></span></li></ol></div><div><span style="color: rgb(255, 0, 0);"><strong>普通函数在调用时，其中的this全部都指向window 如下:</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">var</span><span> x=10;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">var</span><span> fn=</span><span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>);&nbsp;&nbsp; </span><span class="comment">//window</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>.x); </span><span class="comment">//10</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span>fn();&nbsp;&nbsp;</span></li></ol></div><div><span style="color: rgb(255, 0, 0);"><strong>以上代码很好理解，如果函数里套子函数this仍然指向window 如下：</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">var</span><span> x=10;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">var</span><span> obj=&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;x:10,&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;fn:<span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span> f()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>);&nbsp;&nbsp; </span><span class="comment">//window</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>.x); </span><span class="comment">//10</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span>obj.fn();&nbsp;&nbsp;</span></li></ol></div><div><span style="color: rgb(0, 0, 255);"><strong>除非用局部变量 var that=this; 重新定义this 这时候的that 变量只能在函数内部调用，如下：</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">var</span><span> name=</span><span class="string">&quot;The Window&quot;</span><span>;&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">var</span><span> object=&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　name:<span class="string">&quot;My Object&quot;</span><span>,&nbsp;&nbsp;</span></span></li><li><span>　　getNameFunc:<span class="keyword">function</span><span>()&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>　　　　<span class="keyword">var</span><span> that=</span><span class="keyword">this</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(that);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//Object &#123;name: &quot;My Object&quot;&#125;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>.name); </span><span class="comment">//My Object</span><span>&nbsp;&nbsp;</span></span></li><li><span>　　&#125;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li><li><span>object.getNameFunc();&nbsp;&nbsp;</span></li></ol></div><div>&nbsp;</div></div></div></div></div></div></div>
]]>
</description>
</item><item>
<link>http://pic1.liuxinxiu.com:80/JS_this/#blogcomment</link>
<title><![CDATA[[评论] 深入理解javascript原型和闭包（10）——this]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://pic1.liuxinxiu.com:80/JS_this/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>