<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Тонкости ECMA-262-3. Часть 3. This.</title>
	<atom:link href="http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/feed/" rel="self" type="application/rss+xml" />
	<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/</link>
	<description>by Dmitry Soshnikov</description>
	<lastBuildDate>Sat, 04 Feb 2012 03:57:06 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Dmitry Soshnikov</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/comment-page-1/#comment-12456</link>
		<dc:creator>Dmitry Soshnikov</dc:creator>
		<pubDate>Mon, 30 Jan 2012 05:04:57 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=19#comment-12456</guid>
		<description>@ &lt;b&gt;Sergey&lt;/b&gt;

&lt;blockquote&gt;чем отличается &lt;code&gt;(foo.bar = foo.bar)()&lt;/code&gt;
от &lt;code&gt;foo.bar = foo.bar; foo.bar();&lt;/code&gt;&lt;/blockquote&gt;

В первом случае, &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/#vyizov-funktsii-i-ne-tip-reference&quot; rel=&quot;nofollow&quot;&gt;как было отмечено&lt;/a&gt; в этой статье, оператор присваивания вызывает внутренний метод &lt;code&gt;GetValue&lt;/code&gt;. Данный метод в свою очередь &quot;портит&quot; значение типа &lt;code&gt;Reference&lt;/code&gt;, получая &lt;em&gt;истинное значение&lt;/em&gt; (саму функцию &lt;code&gt;foo.bar&lt;/code&gt;).

Потеря значения типа &lt;code&gt;Reference&lt;/code&gt; приводит к глобальному &lt;code&gt;this&lt;/code&gt; в ES3 (в ES5 в &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/&quot; rel=&quot;nofollow&quot;&gt;strict-mode&lt;/a&gt; &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/#codethiscode-value-restrictions&quot; rel=&quot;nofollow&quot;&gt;будет&lt;/a&gt; &lt;code&gt;undefined&lt;/code&gt; в качестве &lt;code&gt;this&lt;/code&gt;).

Обратите еще раз внимание, что &lt;em&gt;просто&lt;/em&gt; оператор группировки (обрамляющие скобки), &lt;em&gt;не вызывает&lt;/em&gt; &lt;code&gt;GetValue&lt;/code&gt;, и таким образом вызов функции получает &lt;code&gt;this&lt;/code&gt; как объект &lt;code&gt;foo&lt;/code&gt;: &lt;code&gt;(foo.bar)();&lt;/code&gt;.

Во втором же случае у Вас просто два независимых действия. Первое никак не относится к определению &lt;code&gt;this&lt;/code&gt;; Вы просто &quot;переприсвоили&quot; функции значение самой себя. А вот дальше уже идет активация функции, и именно в этот момент определяется  &lt;code&gt;this&lt;/code&gt;, как объект &lt;code&gt;foo&lt;/code&gt;, поскольку слева от скобок вызова -- &lt;code&gt;Reference&lt;/code&gt;, т.е. &lt;em&gt;аккессор&lt;/em&gt; -- доступ к свойству через точку.

&lt;blockquote&gt;&lt;code&gt;(eval=eval)(&quot;/*global code*/&quot;);&lt;/code&gt; или &lt;code&gt;(1,eval)(&quot;&quot;);&lt;/code&gt;
Такая техника называется indirect call.&lt;/blockquote&gt;

Да, есть такой вызов &lt;code&gt;eval&lt;/code&gt;&#039;a. Подробней я его &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/#indirect-eval-call&quot; rel=&quot;nofollow&quot;&gt;описывал&lt;/a&gt; в статье про &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/&quot; rel=&quot;nofollow&quot;&gt;strict-mode&lt;/a&gt;.

Суть его опять же сводится к &lt;code&gt;Reference&lt;/code&gt; типу. Проще -- только &lt;code&gt;eval&lt;/code&gt; записанный в данной &lt;em&gt;синтаксической&lt;/em&gt; форме, является &lt;em&gt;явным (direct)&lt;/em&gt;:

[js]eval(...);[/js]

&lt;em&gt;Все остальные&lt;/em&gt; синтаксические формы -- это уже &lt;em&gt;косвенные (indirect)&lt;/em&gt; вызовы и исполняются в глобальном контексте. Причины этого связаны с особенностями реализации &lt;code&gt;eval&lt;/code&gt;&#039;a и с безопасностью.</description>
		<content:encoded><![CDATA[<p>@ <b>Sergey</b></p>
<blockquote><p>чем отличается <code>(foo.bar = foo.bar)()</code><br />
от <code>foo.bar = foo.bar; foo.bar();</code></p></blockquote>
<p>В первом случае, <a href="http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/#vyizov-funktsii-i-ne-tip-reference" rel="nofollow">как было отмечено</a> в этой статье, оператор присваивания вызывает внутренний метод <code>GetValue</code>. Данный метод в свою очередь &#8220;портит&#8221; значение типа <code>Reference</code>, получая <em>истинное значение</em> (саму функцию <code>foo.bar</code>).</p>
<p>Потеря значения типа <code>Reference</code> приводит к глобальному <code>this</code> в ES3 (в ES5 в <a href="http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/" rel="nofollow">strict-mode</a> <a href="http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/#codethiscode-value-restrictions" rel="nofollow">будет</a> <code>undefined</code> в качестве <code>this</code>).</p>
<p>Обратите еще раз внимание, что <em>просто</em> оператор группировки (обрамляющие скобки), <em>не вызывает</em> <code>GetValue</code>, и таким образом вызов функции получает <code>this</code> как объект <code>foo</code>: <code>(foo.bar)();</code>.</p>
<p>Во втором же случае у Вас просто два независимых действия. Первое никак не относится к определению <code>this</code>; Вы просто &#8220;переприсвоили&#8221; функции значение самой себя. А вот дальше уже идет активация функции, и именно в этот момент определяется  <code>this</code>, как объект <code>foo</code>, поскольку слева от скобок вызова &#8212; <code>Reference</code>, т.е. <em>аккессор</em> &#8212; доступ к свойству через точку.</p>
<blockquote><p><code>(eval=eval)("/*global code*/");</code> или <code>(1,eval)("");</code><br />
Такая техника называется indirect call.</p></blockquote>
<p>Да, есть такой вызов <code>eval</code>&#8216;a. Подробней я его <a href="http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/#indirect-eval-call" rel="nofollow">описывал</a> в статье про <a href="http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/" rel="nofollow">strict-mode</a>.</p>
<p>Суть его опять же сводится к <code>Reference</code> типу. Проще &#8212; только <code>eval</code> записанный в данной <em>синтаксической</em> форме, является <em>явным (direct)</em>:</p>
<pre class="brush: jscript; title: ;">eval(...);</pre>
<p><em>Все остальные</em> синтаксические формы &#8212; это уже <em>косвенные (indirect)</em> вызовы и исполняются в глобальном контексте. Причины этого связаны с особенностями реализации <code>eval</code>&#8216;a и с безопасностью.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Sergey</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/comment-page-1/#comment-12453</link>
		<dc:creator>Sergey</dc:creator>
		<pubDate>Mon, 30 Jan 2012 02:27:13 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=19#comment-12453</guid>
		<description>Дмитрий спасибо за замечательную статью!
Объясните пожалуйста чем отличается &lt;code&gt;(foo.bar = foo.bar)()&lt;/code&gt;
от &lt;code&gt;foo.bar = foo.bar; foo.bar();&lt;/code&gt;

И ещё вопрос о том же, я знаю что чтобы вызвать &lt;code&gt;eval&lt;/code&gt; (да и в принципе любую функцию) в глобальном контексте можно написать что то вроде &lt;code&gt;(eval=eval)(&quot;/*global code*/&quot;);&lt;/code&gt; или &lt;code&gt;(1,eval)(&quot;&quot;);&lt;/code&gt;
Такая техника называется indirect call.


Могли бы вы пояснить логику выполнения этого выражения?

Спасибо.</description>
		<content:encoded><![CDATA[<p>Дмитрий спасибо за замечательную статью!<br />
Объясните пожалуйста чем отличается <code>(foo.bar = foo.bar)()</code><br />
от <code>foo.bar = foo.bar; foo.bar();</code></p>
<p>И ещё вопрос о том же, я знаю что чтобы вызвать <code>eval</code> (да и в принципе любую функцию) в глобальном контексте можно написать что то вроде <code>(eval=eval)("/*global code*/");</code> или <code>(1,eval)("");</code><br />
Такая техника называется indirect call.</p>
<p>Могли бы вы пояснить логику выполнения этого выражения?</p>
<p>Спасибо.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alex</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/comment-page-1/#comment-7282</link>
		<dc:creator>Alex</dc:creator>
		<pubDate>Tue, 13 Sep 2011 21:25:19 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=19#comment-7282</guid>
		<description>Большое спасибо за статью, очень актуальный вопрос.</description>
		<content:encoded><![CDATA[<p>Большое спасибо за статью, очень актуальный вопрос.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

