Цитата:
|
Цитата:
Т.е. для b - это не так , не из любого места ( см пример для B(1); ) и выхожу я в примере ( частично ) из контекста Замыкания. |
kefi, Вы что-то больше себя путаете, толком сами не определились, что хотите спросить (и что конкретно не понятно). Не надо подобных примеров с тучей комментарием, тучей переменных и т.д. Если хотите что-то понять, и осознать (и чтобы легко запоминалось) - надо делать это на примерах с "a" и "b" - не более.
Цитата:
Цитата:
Цитата:
Цитата:
P.S.: Цитата:
|
Цитата:
|
Все-таки жесть этот JavaScript.
Нужна лексическая область видимости -- юзайте лексическую, нужна динамическая -- используйте ее, опять же. А тут смешали бензин с кошачьим дерьмом, надеясь получить взрывную смесь, а получили... бензин с кошачьим дерьмом вперемешку. Пусть дан такой кодец: var x = 0; var f = function() { return x; } var g = function() { var x = 1; return f(); } Если область видимости динамическая, то g вернет 1, а если лексическая -- то 0. И не нужные никакие activation objects, [[SCOPE]] и прочая муть. :) Читать: http://en.wikipedia.org/wiki/Scope_(programming) или SICP, там отличные примеры. Ну и конкретно по JS: http://www.digital-web.com/articles/...in_javascript/ |
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
И , Кстати, причем здесь взрывная смесь? Без Замыканий при использовании функций в качестве переменных логически невозможно обойтись , даже если Вы не нуждаетесь ни в какой взрывной смеси. |
Цитата:
"Замыкания могут общаться через свои Скопы Замыкания" и это: "...с частичным выходом из Контекста Замыкания" и уж тем более: "Программма всегда может получить доступ ко всему [[Scope]]'у' Замыкания передав управление в Замкнутую функцию ЧЕРЕЗ Замыкание." p.s. и первый, и второй пример - совершенно обычные по своему поведению, всё абсолютно в рамках логики языка, немного усложнено рекурсией, но это ничего не меняет в схеме создания scope chain и в схеме разрешения идентификаторов. |
Цитата:
1) Цитата:
т.е. myScope(), а не через C(). Цитата:
Цитата:
Повторю их немного яснее. /* Более корректное Уточнение Замыкания . Замыкание - установка Защитника(Телохранителя) для Скопа Замыкания(см ниже). Пока он живой или пока живы те, кому его скопировали, СкопЗамыкания не убить. Защитником является переменная Замыкания (или просто 'Замыкание'), т.е. ссылка на замыкаемую функцию (переменная или фактический параметр). Установить Замыкание (Замкнуть) - можно ТОЛЬКО на Уровне(см ниже Уровни) Контекста Замыкания и вложенных. Установить - значит присвоить с помощью FE ссылку на функцию переменной или, точнее, просто использовать Имя Замыкаемой функции в выражении . Когда Программа может менять слоты [[Scope]]'a' Замыкания (основная проблема анализа Замыканий): [[Scope]] Замыкания - [[Scope]] замыкаемой функции. Он Живой пока живой его Защитник ссылка на Замыкаемую функцию. Контекст Замыкания - Весь Внешний контекст Замыкаемой функции, т.е. Весь Контекст в который она вложена. Все вызовы через Замыкание происходят с использованием [[Scope]]-а Замыкания для определения в вызываемой функции значений свободных переменных, точнее слотов [[Scope]]'а Замыкания . Уровни Контекста - Верхний(0 или Global),Первый(1 или функций Верхнего уровня(А функций)), Второй(2 или B) , etc ... ( Уровнем Контекста Замыкания считается не Global,а Уровень контекста Замыкаемой функции. ) В случае выхода управления на Верхний уровень Программе оказываются доступными только слоты [[Scope]]'а' Замыкания для [[Scope Chain]]'а' этого уровня, т.е. только [[VO]]Global. Если управление выходит из Контекста Замыкания не полностью на Верхний Уровень, а на какой-то его Уровень ниже, то Программе на этом Уровне становятся доступными ТОЛЬКО слоты [[Scope]]'а' Замыкания для [[Scope Chain]]'а' этого Уровня , При дальнейшем входе с этого Уровня на Вложенные уровни, вновь создаваемые [[VO]] вложенных уровней ЗАКРЫВАЮТ(консервируют) сответствующие [[VO]] для этих уровней из [[Scope]]'а' Замыкания. Программа всегда может получить доступ ко всему [[Scope]]'у' Замыкания, передав управление в Замкнутую функцию ЧЕРЕЗ Замыкание. Разные Замыкания могут общаться через пересекающиеся слоты своих СкоповЗамыкания. */ function al(o){document.write(o,'<br>')} ; al('g,a,b,c ---------------'); var myScope , g = 0 , myScope2 ; A(); function A(x) { // Вход сюда создает новый [[VO]]A ,но не затрагивает [[VO]]Global === ( [[Scope]]A == [ myScope, g==0 ] ) var a; if (x==1) { a=2; b=2; c=2; al( [g, a, b, c, '<---A( )'] ); myScope(2) ; return } ; if (x==2) { al( [g, a, b, c, '-- имеем в A( )']); return } ; myScope2=B; B(); function B(y,e,e1) { // Вход сюда создает новый [[VO]]B ,но не затрагивает [[VO]]А,[[VO]]Global var b; if (y==1) { a=3; b=3; c=3; eval(e); al( [g, a, b, c,eval(e1) , '<---B( )']); myScope(2); return } ; if (y==2) { al( [g, a, b, c,eval(e1), '-- имеем в B( )']); return } ; C(); function C(z,e,e1) { // Вход сюда создает новый [[VO]]С ,но не затрагивает [[VO]]B, [[VO]]А ,[[VO]]Global var c; if (z==1) { a=4; b=4; c=4; al( [g, a, b, c,eval(e1), '<---C( )']); myScope(2); return } ; if (z==2) { al( [g, a, b, c, eval(e1), '-- имеем в C( )']); return } ; // myScope = B ; // [[Scope]]B == [ myScope, g==0,a==1,x, B ] // Замкнуть, Контекстом Замыкания будет весь Внешний Контекст функции C : myScope = C ; // [[Scope]] Замыкания [[Scope]]C == [ myScope, g==0,a==1,b==1, x, y, B, C ] // g,a,b,c --------------- // 0,,,,-- имеем в C( ) // <-исходное состояние [[Scope]]'а' Замыкания myScope(2); // Выход на уровень Контекста Global - Полный выход из Контекста Замыкания, В вызываемой функции A // никакие слоты [[Scope]]'a' Замыкания не доступны, кроме [[Scope]]A === [[VO]]Global слотов (ни а ни b не изменить) // 0,2,2,2,<---A( ) // 0,,,,-- имеем в C( ) A(1); // Выход на Уровень Контекста А - Частичный выход из Контекста Замыкания, // в вызываемой B() будут доступны только слоты [[Scope]]'a' Замыкания для [[Scope]]B ( a можем изменить, b -нет ) // 0,3,3,3,<---B( ) // 0,3,,,-- имеем в C( ) // 0,3,3,1,-- имеем в C( ) для вызова C(2) вместо myScope(2),т.е. b меняем ! B(1); // Выход на уровень Контекста B, Нет выхода из Конекста Замыкания, // в вызываемой С() будут доступны все слоты [[Scope]]'a' Замыкания для [[Scope]]C (a и b можно изменить) C(1); // 0,4,4,4,<---C( ) // 0,4,4,,-- имеем в C( ) return; // Выход на уровень Контекста B }; return ; // Выход на уровень Контекста A }; return ; // Выход на уровень Контекста Global - Полный выход из Контекста Замыкания }; al('-----------Как Разные Замыкания могут общаться через пересекающиеся слоты своих СкоповЗамыкания. ---------------------'); al([g,a,b,c,'--имеем в Global как нагрузку от некоторых первичных присваиваний во внутренних функциях ']); // 0,4,2,3,--имеем в Global myScope2(2); // 0,4,,3,-- имеем в B( ) - в СкопеЗамыкания B имеем тот же a , что и myScope(2); // 0,4,4,,-- имеем в C( ) в СкопеЗамыкания C (но переменной b из СкопаЗамыкания С в СкопеЗамыкания B нет) myScope2(1,'var ee=11'); // 0,3,3,3,<---B( ) // 0,3,4,,-- имеем в C( ) //myScope(2,1,'ee'); // ee НЕ ОПРЕДЕЛЕН в C !!! EVAL не меняет слоты Контекста Замыкания ! al([g,a,b,c,'--имеем в Global как нагрузку от некоторых первичных присваиваний во внутренних функциях ']); // 0,4,2,3,--имеем в Global |
Цитата:
Вы упорно пытаетесь перевести общепринятую логику стандарта на птичий язык ньюба, где происходит "установка Защитника(Телохранителя)", где этим "Защитником является переменная Замыкания", где происходит некий "частичный выход из Контекста Замыкания" и так далее. Предположу, что эти ассоциации помогают вам вникать в суть вещей, но повторюсь - примеры простейшие, никаких в них нет странностей, сверхъестественного, начните, наконец, изучать стандарт и стараться разговаривать на его языке. Что ж мы воду толчём в ступе... |
Часовой пояс GMT +3, время: 02:17. |