JS и его "недостатки"
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.123] |
|
|
Правила раздела:
| Страницы: (66) « Первая ... 61 62 [63] 64 65 ... Последняя » ( Перейти к последнему сообщению ) |
JS и его "недостатки"
|
Сообщ.
#931
,
|
|
|
|
Цитата applegame @ Контекста выше не существует, он убит при выходе из функции get(). Ну думаешь же ты, что интерпретатор сохраняет все контексты выше замыкания? Это был бы сущий кошмар. Не все контексты выше замыкания, а тот контекст в котором была создана вложенная функция. |
|
Сообщ.
#932
,
|
|
|
|
ну точнее должен, но на внутреннем уровне это реализовано скорее всего именно ссылкой, как ты сказал
|
|
Сообщ.
#934
,
|
|
|
|
Цитата Астарот @ ВСЕ контексты? Да ну нафиг... По-моему нет все, где есть var'ы, т.к. повторюсь, если по-русски, то var - это приватная статическая переменная =) |
|
Сообщ.
#935
,
|
|
|
|
Цитата Serafim @ А если в этом контексте триллиарды огромных объектов, которые более не используются? Они что тоже будут жить вместе с замыканием? Сохраняет =) Если переводить на русский язык - var - это приватная статическая переменная |
|
Сообщ.
#936
,
|
|
|
|
Не, он скорее всего будет сохранять вплоть до того контекста, к которому есть обращение. То есть если из замыкания мы обращаемся к переменной в глобальной области видимости, то он и ее сохранит. Наверное... Надо бы кодом проверить.
Добавлено Цитата applegame @ А если в этом контексте триллиарды огромных объектов, которые более не используются? Думаю он чистит контекст от тех объектов, к которым нет обращения - нафиг они нужны, если их никто не запрашивает? |
|
Сообщ.
#937
,
|
|
|
|
Цитата Астарот @ Вообще-то замыкание может сцапать переменную на сколько угодно контекстов выше: http://ideone.com/VipqFU Не все контексты выше замыкания, а тот контекст в котором была создана вложенная функция. |
|
Сообщ.
#938
,
|
|
|
|
т.е. если перекладывать всё на русский, то получаем:
![]() ![]() function any(){ // функция или конструктор } any.some = 23; // публичное статическое свойство any.prototype.some = 23; // публичное свойство инстанса var some = 23 // приватное статическое свойство у window и если немного усложнить, т.е. добавить всё это в единый контекст: ![]() ![]() (function(){ // замыкание var some = 23; // приватное статическое свойство этого замыкания function any(){ // конструктор или функция this.some = 23; // либо контекст инстанса, либо контекст функции (в зависимости от того, как вызываешь) } any.some = 23; // публичное статическое свойство any.prototype.some = 23; // публичное свойство инстанса })(); в последнем примере мы имеем контекст всех операций - это замыкание, но не можем к нему обратиться, например к asd(), т.к. мы сокрыли его внутри этого замыкания. В таком случае нужно функцию вывести наружу, а результат замыкания присвоить к переменной: ![]() ![]() var asd = (function(){ function asd(){ } return asd; })(); В этом случае мы к переменной var asd присвоили ссылку на функцию function asd(){} во внутреннем контексте. Как-то так =) |
|
Сообщ.
#939
,
|
|
|
|
Впрочем, похоже Serafim прав, оно хранит всю цепочку контекстов. Если двиг JS достаточно умный, то лишние переменные, на которые в коде нет ссылок он может повыкидывать.
По сути в замыкание передается не ссылка на саму переменную, а ссылка на контекст с этой переменной. Добавлено Serafim, да это мы все знаем. Интересовали технические тонкости внутренней реализации. Вут тут надыбал понятно разжевано и по-русски http://learn.javascript.ru/closures |
|
Сообщ.
#940
,
|
|
|
|
Цитата applegame @ а ссылка на объект с этой переменной. на контекст, т.к. функция - это не совсем объект, это скорее класс =) |
|
Сообщ.
#941
,
|
|
|
|
Цитата Serafim @ я уже поправил, оговорка так-сказать на контекст, т.к. функция - это не совсем объект, это скорее класс =) |
|
Сообщ.
#942
,
|
|
|
|
Цитата applegame @ Интересовали технические тонкости внутренней реализации. ну тут на уровне магии всё, имхо. Курить V8 мне пока религия не позволяет |
|
Сообщ.
#943
,
|
|
|
|
Кложуры в других языках устроены по другому. Скажем в C++ или D, все гораздо силнее оптимизированно и лишний хлам в памяти не держится.
|
|
Сообщ.
#944
,
|
|
|
|
Цитата applegame @ Вообще-то замыкание может сцапать переменную на сколько угодно контекстов выше: http://ideone.com/VipqFU Так к ней явное обращение есть - таки да, как я и сказал, сцапает. А вот сцапает ли соседнюю переменную к которой нет обращения - вопрос... Добавлено Цитата applegame @ Впрочем, похоже Serafim прав, оно хранит всю цепочку контекстов. Если двиг JS достаточно умный, то лишние переменные, на которые в коде нет ссылок он может повыкидывать. Легко проверить положив в контекст что-то ТЯЖЕЛОЕ, что б было в таскманагере видно, как приросла память, и поиграть удалением обращения к этому объекту. |
|
Сообщ.
#945
,
|
|
|
|
Цитата applegame @ Кложуры в других языках устроены по другому я выше приводил в пример сравнение JS замыканий и PHP. Там было видно, что во втором переменные как раз передаются внутрь замыкания и доступа к внешнему контексту у них нет =) В первом же - наоборот |