Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> closure - замыкание, сокрытие, приближение? как корректнее перевести 
:(
    Опции темы
AKS
Дата 19.11.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, скачал "Функциональное программирование".djvu. А что за расширение и как к нему "подобраться"?
PM MAIL   Вверх
Zeroglif
Дата 19.11.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  19.11.2006,  18:59 Найти цитируемый пост)
djvu. А что за расширение и как к нему "подобраться"?

http://windjview.sourceforge.net/

Цитата(AKS @  19.11.2006,  18:59 Найти цитируемый пост)
Переменные нельзя удалить оператором delete.

Код

eval('var x = 0');
var y = 1;
delete y;
alert(y);
delete x;
alert(x);


Цитата(12345c @  19.11.2006,  13:03 Найти цитируемый пост)
Zeroglif, если в 2 словах, то замыкания внутренних функций происходят в момент высвобождения памяти внешней функцией при окончании её; и существуют, если только были присвоены внешним переменным? Больше никаких принципиальных моментов в замыканиях нет?

Имхо, с одной стороны, нет принципиальной разницы в том, вернули функцию или она просто работает внутри. Всё тот же доступ к scope chain. Но с другой стороны, наибольший (наглядный) смысл "замыкания" приобретают именно после выхода из объемлющей функции, когда вложенная функция продолжает жить (может и не одна, а несколько под каждый вызов с разными значениями), переживая своё лексическое окружение. Поэтому D.Cornford связывает появление замыкания именно с жизнью после смерти:

Цитата

A closure is formed when one of those inner functions is made accessible outside of the function in which it was contained...

PM MAIL WWW   Вверх
SelenIT
Дата 19.11.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



AKS, насколько я понимаю, это некий open-source'ный аналог PDF. Вот навскидку нашел 2 читалки: отдельная и плагин для браузера...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 19.11.2006, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



О, скачал WinDjView! Тольк читать страшно - "SECD-машина, ленивая SECD-машина".        ;)

Zeroglif, 
Код

eval('var x = 0');

Очередной трюк. Почему переменная не получает атрибут { DontDelete }?

Добавлено @ 20:00 
Zeroglif, вот это да! Я и не знал, что eval такой "коварный" - можно даже функцию удалить:
Код

eval('function F() { alert("F"); }');
delete F; 
alert(F); // а нету F


Это сообщение отредактировал(а) AKS - 19.11.2006, 20:01
PM MAIL   Вверх
AKS
Дата 19.11.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, с этим eval (evil as D.Crockford sad) надо бы разобраться:
Код

//IE only
var x = 1;
(function() {
    eval.call(window, 'var x = 2;'); // nothing happened
})();
alert(x);                            // it's still 1
(function() {
    eval.call(window, 'x = 2;');     // new value is copied into x
})();
alert(x);                            // return 2

PM MAIL   Вверх
12345c
Дата 19.11.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Цитата(Zeroglif @  19.11.2006,  19:22 Найти цитируемый пост)
eval('var x = 0');
var y = 1;
delete y;
alert(y);
delete x;
alert(x);
А странно. Почему "var y=1;" удалить нельзя, а просто "y=1;" - можно? Это замысел или своеволие? И то же к сути примера, почему "eval var x" удаляется?

А относительно замыканий - их более точный перевод для западного читателя тогда - зомбированные функции, а для нашего - дубли по Стругацким.

PM WWW   Вверх
Zeroglif
Дата 20.11.2006, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(12345c @  19.11.2006,  23:23 Найти цитируемый пост)
Почему "var y=1;" удалить нельзя, а просто "y=1;" - можно?

Потому что в первом случае переменная, а во втором - свободный идентификатор, который позже станет свойством global object, т.к. никому не принадлежит изначально. Все переменные в процессе конкретизации становятся свойствами определённого variable object с аттрибутом DontDelete (ECMAScript 10.2).

Цитата(12345c @  19.11.2006,  23:23 Найти цитируемый пост)
И то же к сути примера, почему "eval var x" удаляется?

Для кода eval при конкретизации переменных аттрибут DontDelete не задаётся (ECMAScript 10.2.2).

Цитата(12345c @  19.11.2006,  23:23 Найти цитируемый пост)
Это замысел или своеволие?

Чей-то своевольный замысел... smile

PM MAIL WWW   Вверх
12345c
Дата 20.11.2006, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Цитата(Zeroglif @  19.11.2006,  19:22 Найти цитируемый пост)
Имхо, с одной стороны, нет принципиальной разницы в том, вернули функцию или она просто работает внутри. 
Пример, показывающий, что "зомби" при жизни окружения ведут себя как простые функции smile

Код
<script>d=document;

function fa(){
var c=1;
fb=function (){return c+1;/*будет замыканием под (глобальным) именем fb*/}
    // пока что прообраз замыкания ведёт себя как простая функция:
  d.write(fb()+'<br>'); //первый раз показывает 2
  c++;
  d.write(fb()+'<br>') //теперь выдаёт 3
  c++;
}
fa()
  d.write(fb()+'<br>') //теперь - 4, несмотря на то, что "c" уже нет
</script>
fb "зомбировано" на запоминание удаляемого окружения при окончании внешней функции.
Пример 2 - попытаемся удалить глобальную переменную, чтобы как-то зазомбировать на её значение.

Код
//2-й эксперимент

a=1;
(function(){
  f=function(){return a+1;}
  d.write(f()+'<br>')
  a++;
  //delete a; //ни здесь не удастся искусственно зомбировать функцию на пропавшую "а", ни ниже
})()
delete a;
d.write(f()+'<br>') //даёт ошибку о том, что "a" нет. Не зомбируется.
Итого, конечно, механизм зомбирования в момент окончания функции легко реализовать, а удаление глобальных переменных в произвольных местах - где ловить? Реализация была бы тяжёлой.

Цитата(Zeroglif @  20.11.2006,  00:33 Найти цитируемый пост)
Все переменные в процессе конкретизации становятся свойствами определённого variable object с аттрибутом DontDelete
Можно как-то получить доступ к этому атрибуту?

(Ещё вопрос, никто не знает, чем перловые замыкания отличаются от JS?)

Это сообщение отредактировал(а) 12345c - 20.11.2006, 02:06
PM WWW   Вверх
Zeroglif
Дата 20.11.2006, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(12345c @  20.11.2006,  01:38 Найти цитируемый пост)
Пример, показывающий, что "зомби" при жизни окружения ведут себя как простые функции

А чем простая функция отличается от "зомби"? Что первая, что вторая не знают есть переменная или нет, они только держат цепочку объектов, которую им нужно обойти, чтобы найти определённый идентификатор.

Цитата(12345c @  20.11.2006,  01:38 Найти цитируемый пост)
несмотря на то, что "c" уже нет

А "с" условно говоря никогда и не было, есть только scope chain, функция деталей (имён, значений) не видит. Например, локальной переменной в момент определений вложенной функции и в момент её вызова изнутри может вообще не существовать.

Код

var f;

(function () {
    // в момент создания функции "x" не существует
    f = function(){
        return typeof x + '<br>';
    }
    // в момент вызова то же самое
    document.write(f());
    // через eval добавим локальную переменную х
    eval('var x = \'var\'');
})();

// только теперь замыкание находит "x"
document.write(f());


PM MAIL WWW   Вверх
Zeroglif
Дата 20.11.2006, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(12345c @  20.11.2006,  01:38 Найти цитируемый пост)
Пример 2 - попытаемся удалить глобальную переменную, чтобы как-то зазомбировать на её значение.

Богат русский язык на обороты. smile 

Если будет удалена переменная, то замыкание само собой её не найдёт, т.к. не найдёт свойства с таким именем в scope chain, никаких значений оно не запоминает. Нормальное поведение. По сему тут нужно или вставлять в scope chain дополнительный объект или передавать значение переменной во вложенную функцию, или создавать некое свойство в функции и работать уже с ним. В общем без переделки не обойтись. Например, так:

Код

with({a:a}) f=function(){return ++a;}

PM MAIL WWW   Вверх
AKS
Дата 20.11.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif, 
Цитата

аттрибут DontDelete не задаётся (ECMAScript 10.2.2).

Ну вот, обломался я. Думал с утра в "следопыты" опять подамся, начну очередное "мини-исследование" с eval. А оказывается все давно "черным по белому"... smile
Вообще, логично все получается - нельзя в момент экзекуции установить какие-либо внутрение атрибуты. 
PM MAIL   Вверх
rene
Дата 21.11.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Попробывал изобразить "closure":

Код

function A()
{
       var hi="Hello"
       return function() { var name="Earl"; alert(hi+" "+name) }
}
var a = A()
a()



Это сообщение отредактировал(а) rene - 21.11.2006, 20:08

Присоединённый файл ( Кол-во скачиваний: 26 )
Присоединённый файл  closure.jpg 23,84 Kb
PM MAIL ICQ   Вверх
Zeroglif
Дата 22.11.2006, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(rene @  21.11.2006,  20:07 Найти цитируемый пост)
Попробывал изобразить "closure"

Наглядно. А в какой программе можно быстро и удобно строить такие схемы как эти:

http://billhails.net/Book/closure-captures-env-n.png
http://billhails.net/Book/closure-extends-env-n.png

кстати, это замыкание, так что не оффтоп smile

PM MAIL WWW   Вверх
SelenIT
Дата 24.11.2006, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Zeroglif, а у меня наверное оффтоп, но очень-очень близкий: как по-русски можно грамотнее всего "обозвать" Scope chains?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AKS
Дата 24.11.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



SelenIT, а я тут по-быстрому выскажусь, пока вы все спите ;)...
Цитата

как по-русски можно грамотнее всего "обозвать"

Как грамотнее - незнаю, а вот если "чисто" по-русски "обозвать", то могу вот так попробовать:
Scope chain - ряд необходимых (видимых) объектов для исполняемой процедуры.
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0706 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.