<?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>Sun, 13 May 2012 08:41:14 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
	<item>
		<title>By: maksimr</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/comment-page-1/#comment-14150</link>
		<dc:creator>maksimr</dc:creator>
		<pubDate>Sun, 13 May 2012 08:41:14 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=19#comment-14150</guid>
		<description>@max

Если вы говорите про этот пример:

[js]var foo = {
  bar: function () {
    alert(this);
  }
};
(false &#124;&#124; foo.bar)();[/js]

То это выражение возвращает &lt;code&gt;undefined&lt;/code&gt;. Тут основной смысл заключается в том какое значение присвоено ключевому слову &lt;code&gt;this&lt;/code&gt;, и в данном, конкретном, случае &lt;code&gt;this&lt;/code&gt;ссылается на глобальный объект.

Надеюсь я правильно понял ваш вопрос, и смог на него ответить.</description>
		<content:encoded><![CDATA[<p>@max</p>
<p>Если вы говорите про этот пример:</p>
<pre class="brush: jscript; title: ;">var foo = {
  bar: function () {
    alert(this);
  }
};
(false || foo.bar)();</pre>
<p>То это выражение возвращает <code>undefined</code>. Тут основной смысл заключается в том какое значение присвоено ключевому слову <code>this</code>, и в данном, конкретном, случае <code>this</code>ссылается на глобальный объект.</p>
<p>Надеюсь я правильно понял ваш вопрос, и смог на него ответить.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: max</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/comment-page-1/#comment-14094</link>
		<dc:creator>max</dc:creator>
		<pubDate>Fri, 11 May 2012 00:28:37 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=19#comment-14094</guid>
		<description>в примере &quot;Вызов функции и НЕ тип Reference&quot; команда &lt;code&gt;(false &#124;&#124; foo.bar)();&lt;/code&gt; возрашает &lt;code&gt;true&lt;/code&gt;</description>
		<content:encoded><![CDATA[<p>в примере &#8220;Вызов функции и НЕ тип Reference&#8221; команда <code>(false || foo.bar)();</code> возрашает <code>true</code></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Aleksey</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/comment-page-1/#comment-12869</link>
		<dc:creator>Aleksey</dc:creator>
		<pubDate>Thu, 16 Feb 2012 08:24:23 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=19#comment-12869</guid>
		<description>Дмитрий, спасибо за Ваши пояснения! Продолжаю дальше читать Ваши статьи.</description>
		<content:encoded><![CDATA[<p>Дмитрий, спасибо за Ваши пояснения! Продолжаю дальше читать Ваши статьи.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dmitry Soshnikov</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/comment-page-1/#comment-12844</link>
		<dc:creator>Dmitry Soshnikov</dc:creator>
		<pubDate>Tue, 14 Feb 2012 07:11:12 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=19#comment-12844</guid>
		<description>@&lt;b&gt;Aleksey&lt;/b&gt;

&lt;blockquote&gt;Объясните, пожалуйста, подробнее, какое же все-таки значение будет принимать ключевое слово this в тот момент, когда мы только входим в контекст исполнения.&lt;/blockquote&gt;

Значение &lt;code&gt;this&lt;/code&gt; всегда определяется до интерпретации программы (т.е., когда мы видим какой-то код и начинаем его исполнять -- уже точно известно, что содержит &lt;code&gt;this&lt;/code&gt;, и это значение неизменно на протяжении исполнения кода контекста).

&lt;blockquote&gt;Предположим, у нас есть только глобальный контекст исполнения программы. У него определяется свойство this. Какое значение оно будет принимать до интерпретации программы?&lt;/blockquote&gt;

Да, верно, и это значение -- сам &lt;em&gt;глобальный объект&lt;/em&gt;, как было &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/#this-v-globalnom-kode&quot; rel=&quot;nofollow&quot;&gt;отмечено&lt;/a&gt; выше.

&lt;blockquote&gt;В Вашем примере использовалось thisValue. Что оно представляет из себя?&lt;/blockquote&gt;

Это схематического обозначение значения &lt;code&gt;this&lt;/code&gt; в определенном контексте исполнения.

Структура контекста следующая (всего три основных свойства):

[js]executionContext = {
  VO: { хранилище_переменных }, // variable object
  ScopeChain: VO + все родительские VO,
  this: значение this // thisValue
};[/js]

Если есть необходимость, я рекомендую начать с описания самого &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/&quot; rel=&quot;nofollow&quot;&gt;контекста исполнения&lt;/a&gt;, и дальше уже его компонентов: &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/&quot; rel=&quot;nofollow&quot;&gt;VO&lt;/a&gt;, &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/&quot; rel=&quot;nofollow&quot;&gt;ScopeChain&lt;/a&gt; и &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/&quot; rel=&quot;nofollow&quot;&gt;this&lt;/a&gt;. Или же прочитать обзорную лекцию &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/javascript-the-core/&quot; rel=&quot;nofollow&quot;&gt;JavaScript. Ядро&lt;/a&gt;, где все эти моменты так же затрагиваются.</description>
		<content:encoded><![CDATA[<p>@<b>Aleksey</b></p>
<blockquote><p>Объясните, пожалуйста, подробнее, какое же все-таки значение будет принимать ключевое слово this в тот момент, когда мы только входим в контекст исполнения.</p></blockquote>
<p>Значение <code>this</code> всегда определяется до интерпретации программы (т.е., когда мы видим какой-то код и начинаем его исполнять &#8212; уже точно известно, что содержит <code>this</code>, и это значение неизменно на протяжении исполнения кода контекста).</p>
<blockquote><p>Предположим, у нас есть только глобальный контекст исполнения программы. У него определяется свойство this. Какое значение оно будет принимать до интерпретации программы?</p></blockquote>
<p>Да, верно, и это значение &#8212; сам <em>глобальный объект</em>, как было <a href="http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/#this-v-globalnom-kode" rel="nofollow">отмечено</a> выше.</p>
<blockquote><p>В Вашем примере использовалось thisValue. Что оно представляет из себя?</p></blockquote>
<p>Это схематического обозначение значения <code>this</code> в определенном контексте исполнения.</p>
<p>Структура контекста следующая (всего три основных свойства):</p>
<pre class="brush: jscript; title: ;">executionContext = {
  VO: { хранилище_переменных }, // variable object
  ScopeChain: VO + все родительские VO,
  this: значение this // thisValue
};</pre>
<p>Если есть необходимость, я рекомендую начать с описания самого <a href="http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/" rel="nofollow">контекста исполнения</a>, и дальше уже его компонентов: <a href="http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/" rel="nofollow">VO</a>, <a href="http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/" rel="nofollow">ScopeChain</a> и <a href="http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/" rel="nofollow">this</a>. Или же прочитать обзорную лекцию <a href="http://dmitrysoshnikov.com/ecmascript/javascript-the-core/" rel="nofollow">JavaScript. Ядро</a>, где все эти моменты так же затрагиваются.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Aleksey</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/comment-page-1/#comment-12832</link>
		<dc:creator>Aleksey</dc:creator>
		<pubDate>Mon, 13 Feb 2012 11:24:31 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=19#comment-12832</guid>
		<description>Дмитрий, у Вас отличные и &lt;b&gt;главное - интересные&lt;/b&gt; статьи! Спасибо за это! Объясните, пожалуйста, подробнее, какое же все-таки значение будет принимать ключевое слово this в тот момент, когда мы только входим в контекст исполнения. Предположим, у нас есть только глобальный контекст исполнения программы. У него определяется свойство this. Какое значение оно будет принимать до интерпретации программы? В Вашем примере использовалось thisValue. Что оно представляет из себя? Заранее огромное спасибо!</description>
		<content:encoded><![CDATA[<p>Дмитрий, у Вас отличные и <b>главное &#8211; интересные</b> статьи! Спасибо за это! Объясните, пожалуйста, подробнее, какое же все-таки значение будет принимать ключевое слово this в тот момент, когда мы только входим в контекст исполнения. Предположим, у нас есть только глобальный контекст исполнения программы. У него определяется свойство this. Какое значение оно будет принимать до интерпретации программы? В Вашем примере использовалось thisValue. Что оно представляет из себя? Заранее огромное спасибо!</p>
]]></content:encoded>
	</item>
	<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>

