![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| YahоО |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
Есть такое выражение в литературе по js:
"значение остаётся в памяти, пока на него есть хотя бы одна ссылка ... если ссылок на значение нет, то память из-под него очищается". Можно ли вот так проверить правильность приведенного текста:
спрашиваю потому не понятно почему такой скрипт работает, если видим что память не очищается и ссылка на переменную не пропадает, хотя прямая ссылка на переменную в скрипте отсутствует. Было бы понятно, что скрипт должен работать, если бы была добавлена какая-нибудь строка со ссылкой на переменную, например: alert(user.name), но ведь таких ссылок в скрипте нет. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Переменная существует в контексте функции, в которой переменная описана.
Если явного описания функции нет - то в контексте объекта window (для броузера) Чтобы стало совсем непонятно - можно еще контекст функции "передать" во внешний мир из тела функции. Прием называется "замыкание". -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| YahоО |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
"Переменная существует в контексте функции, в которой переменная описана"
Понятно. "Если явного описания функции нет - то в контексте объекта window (для броузера) " Понятно. Чтобы стало совсем непонятно - можно еще контекст функции "передать" во внешний мир из тела функции. Прием называется "замыкание". замыкание - понятно. А почему скрипт работает? Не понятно. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Потому, что переменая user описана в контексте функции. пока описание функции не завершится, или окно броузера не закроется, переменная будет существовать. eval исполняется в том же контексте и ему доступны все переменные, в нем описанные. Стало ли понятнее? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| YahоО |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
Потому, что переменная user описана в контексте функции.
- не понятно, потому что переменная user находится прямо в теге javascript в html и в тексте всего этого тега нет слова "функция" (function). Почему Вы считаете что эта переменная находится в функции? пока описание функции не завершится, или окно броузера не закроется, переменная будет существовать. - а если и окно брнаузера не закроется и "функция" "пропадет" в случае перезагрузки этой страница на другую страницу с этого же сайта, например? Стало ли понятнее? - неааа Добавлено через 2 минуты и 10 секунд "значение остаётся в памяти, пока на него есть хотя бы одна ссылка ... если ссылок на значение нет, то память из-под него очищается". - значит это не работает? Добавлено через 12 минут и 43 секунды Например по данному коду такого вопроса не возникает:
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
? Переменная, описанная внутри тега script, без использования функций будет существовать всегда, до закрытия окна или перехода на другую станицу и исключая "реинкарнации" во время перезагрузки той же страницы. Проверить это легко - в Хроме в консоли отладки нужно ввести имя переменной и убедится в ее существовании. В примере переменная user не существует в контексте, в котором выполняется eval, по этому при выполнении скрипта выводится ошибка. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| YahоО |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
Проверить это легко - в Хроме в консоли отладки нужно ввести имя переменной и убедится в ее существовании.
- вот именно! она СУЩЕСТВУЕТ! все так, а вот почему она (переменная) без последующих ссылок на нее не уничтожена в соответствии с постулатом из "литературы"? "Литература" здесь https://learn.javascript.ru/memory-management Как тогда мне понять эту цитату: "значение остаётся в памяти, пока на него есть хотя бы одна ссылка ... если ссылок на значение нет, то память из-под него очищается" и как проверить (удостовериться) что если ссылок больше на переменную нет то память будет очищена? Добавлено через 2 минуты и 26 секунд Очень точный термин Вы употребили реинкарнация Добавлено через 10 минут и 37 секунд Еще одна цитата оттуда же: "Сборщик мусора идёт от корня по ссылкам и запоминает все найденные объекты. По окончанию – он смотрит, какие объекты в нём отсутствуют и удаляет их." Так может Сборщик мусора так быстро не ходит, как этот мой короткий скрипт (первый) выполняется? Может нужно сделать таймаут (паузу) чтобы Сборщик мусора успел пройти и все почистить, и только потом выполнять eval чтобы user уже не было? |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Ну, дык! Ссылка на эту переменную ЕСТЬ. Можно проверить window.user. Постулируемая очистка переменной наступает, когда контекст функции заканчивается. В случае, если функция не используется - не производится очистка никогда (ну, в разумных значениях этого термина -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| YahоО |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
Дочитал Литературу, есть там и такое :
"Если вы хотите вынести кому-либо мозги, дайте ему почитать эту статью. Более лютого чтива я в своей жизни не встречал. Ю_Ю" "А когда именно сборщик мусора сработает? Сразу же или же он работает через определенное время, типа как по крону? Всё зависит от конкретной реализации JS в браузере. Но точно не мгновенно. Алгоритмы определения интервалов через которые вызывается сборщик мусора мне неведомы. Некоторые браузеры позволяют вручную его запустить." - ну если так обстоит дело, тогда все понятно. Это браузер !!! |
|||
|
||||
| YahоО |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
Перечитав всю эту страницу вполне можно представить не очищенную часть кода, не убитую Сборщиком мусора, и работающую после образования новых объектов как некие клосурики то это и будут так называемые объекты.
Объекты же это нечто осязаемое, ну а клосурики виртуальные, как и есть на самом деле |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |