<?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. Часть 1. Контексты исполнения.</title>
	<atom:link href="http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/feed/" rel="self" type="application/rss+xml" />
	<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/</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: Dmitry Soshnikov</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-12630</link>
		<dc:creator>Dmitry Soshnikov</dc:creator>
		<pubDate>Sat, 04 Feb 2012 03:57:06 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-12630</guid>
		<description>@&lt;b&gt;arbeiter&lt;/b&gt;

&lt;blockquote&gt;А разве понятие вызывающего контекста отсутствует для обычной (пользовательской) функции , чтобы это особо выделять ?&lt;/blockquote&gt;

В данном случае это выделяется, чтобы показать, что &lt;code&gt;eval&lt;/code&gt; воздействует на вызывающий контекст.

Обычная функция, как Вы правильно отметили тоже имеет вызывающий контекст, но, к примеру, объявленный &lt;code&gt;var&lt;/code&gt; внутри функции не создает переменную в вызывающем контексте, как это делает &lt;code&gt;eval&lt;/code&gt;.

&lt;blockquote&gt;Модификации, производимые eval‘ом (например, объявление переменной или функции), воздействуют на вызывающий контекст&lt;/blockquote&gt;

Да, именно так (за исключением, как было &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/#codeevalcode-and-codeargumentscode-restrictions&quot; rel=&quot;nofollow&quot;&gt;отмечено&lt;/a&gt;, strict-mode&#039;a ES5&lt;/a&gt;).</description>
		<content:encoded><![CDATA[<p>@<b>arbeiter</b></p>
<blockquote><p>А разве понятие вызывающего контекста отсутствует для обычной (пользовательской) функции , чтобы это особо выделять ?</p></blockquote>
<p>В данном случае это выделяется, чтобы показать, что <code>eval</code> воздействует на вызывающий контекст.</p>
<p>Обычная функция, как Вы правильно отметили тоже имеет вызывающий контекст, но, к примеру, объявленный <code>var</code> внутри функции не создает переменную в вызывающем контексте, как это делает <code>eval</code>.</p>
<blockquote><p>Модификации, производимые eval‘ом (например, объявление переменной или функции), воздействуют на вызывающий контекст</p></blockquote>
<p>Да, именно так (за исключением, как было <a href="http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/#codeevalcode-and-codeargumentscode-restrictions" rel="nofollow">отмечено</a>, strict-mode&#8217;a ES5).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: arbeiter</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-12600</link>
		<dc:creator>arbeiter</dc:creator>
		<pubDate>Fri, 03 Feb 2012 06:36:09 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-12600</guid>
		<description>&lt;blockquote&gt;С кодом eval‘а — интересней. В данном случае, присутствует понятие вызывающего контекста (calling context), т.е. контекста, из которого вызвана функция eval.&lt;/blockquote&gt;

А разве понятие вызывающего контекста отсутствует для обычной (пользовательской) функции , чтобы это особо выделять ?

&lt;blockquote&gt;Модификации, производимые eval‘ом (например, объявление переменной или функции), воздействуют на вызывающий контекст&lt;/blockquote&gt;

Т.е. например переменная определенная в &lt;strong&gt;eval&lt;/strong&gt; остается доступной в вызывающем контексте и после завершения работы eval т.е. помещается в VO-объект вызывающего контекста ?</description>
		<content:encoded><![CDATA[<blockquote><p>С кодом eval‘а — интересней. В данном случае, присутствует понятие вызывающего контекста (calling context), т.е. контекста, из которого вызвана функция eval.</p></blockquote>
<p>А разве понятие вызывающего контекста отсутствует для обычной (пользовательской) функции , чтобы это особо выделять ?</p>
<blockquote><p>Модификации, производимые eval‘ом (например, объявление переменной или функции), воздействуют на вызывающий контекст</p></blockquote>
<p>Т.е. например переменная определенная в <strong>eval</strong> остается доступной в вызывающем контексте и после завершения работы eval т.е. помещается в VO-объект вызывающего контекста ?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: arbeiter</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-12194</link>
		<dc:creator>arbeiter</dc:creator>
		<pubDate>Sun, 22 Jan 2012 08:12:35 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-12194</guid>
		<description>Спасибо , теперь понятно.</description>
		<content:encoded><![CDATA[<p>Спасибо , теперь понятно.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dmitry Soshnikov</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-12190</link>
		<dc:creator>Dmitry Soshnikov</dc:creator>
		<pubDate>Sun, 22 Jan 2012 05:29:30 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-12190</guid>
		<description>@&lt;b&gt;arbeiter&lt;/b&gt;

&lt;blockquote&gt;Наверное использование push в примере и после Вашей правки не совсем корректно. push ведь добавляет в конец массива (стека) , а добавление д.б. в начало стека.

pop - удаляет последний элемент массива , это тоже выпадает из рамок корректного объяснения.&lt;/blockquote&gt;

Нет, все верно. Стек -- &quot;последний пришел&quot; (добавился &quot;сверху&quot; в конец, &lt;code&gt;push&lt;/code&gt;), первым ушел (удалился тоже &quot;сверху&quot; через &lt;code&gt;pop&lt;/code&gt;).

(Часто фигурирует альтернативная фразировка: &quot;Первым пришел, последним ушел&quot; -- FILO)</description>
		<content:encoded><![CDATA[<p>@<b>arbeiter</b></p>
<blockquote><p>Наверное использование push в примере и после Вашей правки не совсем корректно. push ведь добавляет в конец массива (стека) , а добавление д.б. в начало стека.</p>
<p>pop &#8211; удаляет последний элемент массива , это тоже выпадает из рамок корректного объяснения.</p></blockquote>
<p>Нет, все верно. Стек &#8212; &#8220;последний пришел&#8221; (добавился &#8220;сверху&#8221; в конец, <code>push</code>), первым ушел (удалился тоже &#8220;сверху&#8221; через <code>pop</code>).</p>
<p>(Часто фигурирует альтернативная фразировка: &#8220;Первым пришел, последним ушел&#8221; &#8212; FILO)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: arbeiter</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-12182</link>
		<dc:creator>arbeiter</dc:creator>
		<pubDate>Sat, 21 Jan 2012 15:07:09 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-12182</guid>
		<description>&lt;i&gt;Да, это я просто не совсем удачно выбрал обозначение (путаница с реальной функцией push массивов)&lt;/i&gt;

Наверное использование push в примере и после Вашей правки не совсем корректно. push ведь добавляет в конец массива (стека) , а добавление д.б. в начало стека.

pop - удаляет последний элемент массива , это тоже выпадает из рамок корректного объяснения. 

Надо как-то исхитриться и описать по другому, все ведь привыкли к работе методов Array (push и pop). Хотя смысл примеров понятен.</description>
		<content:encoded><![CDATA[<p><i>Да, это я просто не совсем удачно выбрал обозначение (путаница с реальной функцией push массивов)</i></p>
<p>Наверное использование push в примере и после Вашей правки не совсем корректно. push ведь добавляет в конец массива (стека) , а добавление д.б. в начало стека.</p>
<p>pop &#8211; удаляет последний элемент массива , это тоже выпадает из рамок корректного объяснения. </p>
<p>Надо как-то исхитриться и описать по другому, все ведь привыкли к работе методов Array (push и pop). Хотя смысл примеров понятен.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Serega</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-7221</link>
		<dc:creator>Serega</dc:creator>
		<pubDate>Thu, 01 Sep 2011 18:00:51 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-7221</guid>
		<description>Спасибо, за ответ, все стало на свои места.</description>
		<content:encoded><![CDATA[<p>Спасибо, за ответ, все стало на свои места.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dmitry A. Soshnikov</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-7216</link>
		<dc:creator>Dmitry A. Soshnikov</dc:creator>
		<pubDate>Thu, 01 Sep 2011 07:06:00 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-7216</guid>
		<description>@&lt;b&gt;serega&lt;/b&gt;

&lt;blockquote&gt;При выходе из foo, локалькая переменная x должна быть утерена&lt;/blockquote&gt;

Да, это было бы верно, если бы &lt;em&gt;сами данные&lt;/em&gt; (переменные) хранились бы на стеке. Однако на стеке в языках с замыканиями хранится именно этот &lt;em&gt;контекст исполнения&lt;/em&gt;. В ES3 контекст имеет вид:

[js]
ES3Context = {
  VO / AO: { ... } // ссылка на объект переменных,
  ScopeChain: VO + все родительские VO,
  This: this
};[/js]

Данные хранятся в объекте переменных (VO) -- в данном случае для &lt;code&gt;foo&lt;/code&gt; -- &lt;code&gt;{x: 10, arguments: ...}&lt;/code&gt;. А сам объект переменных хранится в &lt;em&gt;куче&lt;/em&gt; -- и хранится он там до тех пор, пока на него есть хоть одна ссылка.

В момент активации &lt;code&gt;foo&lt;/code&gt; таких ссылки две -- из &lt;code&gt;ES3Context&lt;/code&gt; и из функции &lt;code&gt;bar&lt;/code&gt;, т.к. &lt;code&gt;bar&lt;/code&gt; при &lt;em&gt;создании&lt;/em&gt; запоминает (в своем свойстве &lt;code&gt;[[Scope]]&lt;/code&gt;) &lt;code&gt;ScopeChain&lt;/code&gt; родительского контекта, т.е. контекста &lt;code&gt;foo&lt;/code&gt; (и мы видим, что &lt;code&gt;ScopeChain&lt;/code&gt; &lt;code&gt;foo&lt;/code&gt; содержит VO, где хранится &lt;code&gt;x&lt;/code&gt;):

[js]bar.[[Scope]] = foo.context.ScopeChain;[/js]

Дальше, по выходу из &lt;code&gt;foo&lt;/code&gt;, контекст удаляется со стека, но, т.к. сами &lt;code&gt;VO&lt;/code&gt; и &lt;code&gt;ScopeChain&lt;/code&gt; хранятся на куче (а на стеке -- только ссылки на них), то &lt;code&gt;ScopeChain&lt;/code&gt; остается жить, т.к. на него есть ссылка из &lt;code&gt;bar&lt;/code&gt;.

В общем, все это управляется GC, в зависимости, остались ли ссылки на структуры или нет.

Собственно, это и есть &lt;code&gt;замыкание&lt;/code&gt;, когда функция &lt;code&gt;bar&lt;/code&gt; &lt;em&gt;замкнула&lt;/em&gt; родительский контекст и он остался жить.

Подробней: &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/ru-chapter-6-closures/&quot; rel=&quot;nofollow&quot;&gt;ES3.Ch6.Замыкания&lt;/a&gt; и &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/ru-chapter-4-scope-chain/&quot; rel=&quot;nofollow&quot;&gt;ES3.Ch4.Scope Chain&lt;/a&gt;. Или же наиболее полный вариант: &lt;a href=&quot;http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-1-lexical-environments-common-theory/&quot; rel=&quot;nofollow&quot;&gt;ES5.Ch3.1.Lexical Environments&lt;/a&gt;.</description>
		<content:encoded><![CDATA[<p>@<b>serega</b></p>
<blockquote><p>При выходе из foo, локалькая переменная x должна быть утерена</p></blockquote>
<p>Да, это было бы верно, если бы <em>сами данные</em> (переменные) хранились бы на стеке. Однако на стеке в языках с замыканиями хранится именно этот <em>контекст исполнения</em>. В ES3 контекст имеет вид:</p>
<pre class="brush: jscript; title: ;">
ES3Context = {
  VO / AO: { ... } // ссылка на объект переменных,
  ScopeChain: VO + все родительские VO,
  This: this
};</pre>
<p>Данные хранятся в объекте переменных (VO) &#8212; в данном случае для <code>foo</code> &#8212; <code>{x: 10, arguments: ...}</code>. А сам объект переменных хранится в <em>куче</em> &#8212; и хранится он там до тех пор, пока на него есть хоть одна ссылка.</p>
<p>В момент активации <code>foo</code> таких ссылки две &#8212; из <code>ES3Context</code> и из функции <code>bar</code>, т.к. <code>bar</code> при <em>создании</em> запоминает (в своем свойстве <code>[[Scope]]</code>) <code>ScopeChain</code> родительского контекта, т.е. контекста <code>foo</code> (и мы видим, что <code>ScopeChain</code> <code>foo</code> содержит VO, где хранится <code>x</code>):</p>
<pre class="brush: jscript; title: ;">bar.[[Scope]] = foo.context.ScopeChain;</pre>
<p>Дальше, по выходу из <code>foo</code>, контекст удаляется со стека, но, т.к. сами <code>VO</code> и <code>ScopeChain</code> хранятся на куче (а на стеке &#8212; только ссылки на них), то <code>ScopeChain</code> остается жить, т.к. на него есть ссылка из <code>bar</code>.</p>
<p>В общем, все это управляется GC, в зависимости, остались ли ссылки на структуры или нет.</p>
<p>Собственно, это и есть <code>замыкание</code>, когда функция <code>bar</code> <em>замкнула</em> родительский контекст и он остался жить.</p>
<p>Подробней: <a href="http://dmitrysoshnikov.com/ecmascript/ru-chapter-6-closures/" rel="nofollow">ES3.Ch6.Замыкания</a> и <a href="http://dmitrysoshnikov.com/ecmascript/ru-chapter-4-scope-chain/" rel="nofollow">ES3.Ch4.Scope Chain</a>. Или же наиболее полный вариант: <a href="http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-1-lexical-environments-common-theory/" rel="nofollow">ES5.Ch3.1.Lexical Environments</a>.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: serega</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-7215</link>
		<dc:creator>serega</dc:creator>
		<pubDate>Wed, 31 Aug 2011 20:53:00 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-7215</guid>
		<description>Дмитрий, вы не могли бы пояснить последний код, а именно:

Происходит возврат анонимной функции. Функция обращается к переменной &#039;x&#039;, которая инициализирована в foo. мне не понятно следующее. При выходе из foo, локалькая переменная x должна быть утерена, так как при выходе из контекста, он исчезает со стека. Связь с переменной должна быть утеряна. Тем не менее bar() дает результат = 1. 

Не могли бы вы пояснить, как происходит передача значения?</description>
		<content:encoded><![CDATA[<p>Дмитрий, вы не могли бы пояснить последний код, а именно:</p>
<p>Происходит возврат анонимной функции. Функция обращается к переменной &#8216;x&#8217;, которая инициализирована в foo. мне не понятно следующее. При выходе из foo, локалькая переменная x должна быть утерена, так как при выходе из контекста, он исчезает со стека. Связь с переменной должна быть утеряна. Тем не менее bar() дает результат = 1. </p>
<p>Не могли бы вы пояснить, как происходит передача значения?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dmitry A. Soshnikov</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-7056</link>
		<dc:creator>Dmitry A. Soshnikov</dc:creator>
		<pubDate>Fri, 01 Jul 2011 12:17:21 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-7056</guid>
		<description>&lt;b&gt;Bdiang&lt;/b&gt;

&lt;blockquote&gt;в стэк добавляем 2 элемента, а удаляем один&lt;/blockquote&gt;

Да, это я просто не совсем удачно выбрал обозначение (путаница с реальной функцией &lt;code&gt;push&lt;/code&gt; массивов). Предполагается один элемент с двумя свойствами -- сам контекст, и вызывающий контекст (callingContext или -- caller):

[js]ECStack.push({
  context: evalContext,
  caller: globalContext
});[/js]</description>
		<content:encoded><![CDATA[<p><b>Bdiang</b></p>
<blockquote><p>в стэк добавляем 2 элемента, а удаляем один</p></blockquote>
<p>Да, это я просто не совсем удачно выбрал обозначение (путаница с реальной функцией <code>push</code> массивов). Предполагается один элемент с двумя свойствами &#8212; сам контекст, и вызывающий контекст (callingContext или &#8212; caller):</p>
<pre class="brush: jscript; title: ;">ECStack.push({
  context: evalContext,
  caller: globalContext
});</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bdiang</title>
		<link>http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts/comment-page-1/#comment-7055</link>
		<dc:creator>Bdiang</dc:creator>
		<pubDate>Thu, 30 Jun 2011 03:05:12 +0000</pubDate>
		<guid isPermaLink="false">http://dmitrysoshnikov.com/?p=13#comment-7055</guid>
		<description>Дмитрий, объясните пожалуйста этот момент:

[js]
// eval(&#039;var x = 10&#039;);
ECStack.push(
  evalContext,
  callingContext: globalContext
);
 
// отработал eval
ECStack.pop();
[/js]

А именно: в стэк добавляем 2 элемента, а удаляем один.</description>
		<content:encoded><![CDATA[<p>Дмитрий, объясните пожалуйста этот момент:</p>
<pre class="brush: jscript; title: ;">
// eval('var x = 10');
ECStack.push(
  evalContext,
  callingContext: globalContext
);

// отработал eval
ECStack.pop();
</pre>
<p>А именно: в стэк добавляем 2 элемента, а удаляем один.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

