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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Управление памятью, Достижимость и наличие ссылок 
:(
    Опции темы
YahоО
Дата 21.6.2016, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть такое выражение в литературе по js:

"значение остаётся в памяти, пока на него есть хотя бы одна ссылка ... 
если ссылок на значение нет, то память из-под него очищается".

Можно ли вот так проверить правильность приведенного  текста:

Код

var user = {
  name: "Вася"
};
eval('al'+'ert(use'+'r.n'+'ame)');


спрашиваю потому не понятно почему такой скрипт работает,
если видим что память не очищается и ссылка на переменную не пропадает, хотя прямая ссылка на переменную в скрипте отсутствует.

Было бы понятно, что скрипт должен работать, если бы была добавлена какая-нибудь строка со ссылкой на переменную, например: 
alert(user.name), но ведь таких ссылок в скрипте нет.
PM MAIL   Вверх
ksnk
Дата 21.6.2016, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Переменная существует в контексте функции, в которой переменная описана.
Если явного описания функции нет - то в контексте объекта window (для броузера) 
Чтобы стало совсем непонятно - можно еще контекст функции "передать" во внешний мир из тела функции. Прием называется "замыкание". 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
YahоО
Дата 21.6.2016, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



"Переменная существует в контексте функции, в которой переменная описана"
Понятно.

"Если явного описания функции нет - то в контексте объекта window (для броузера) "
Понятно.

Чтобы стало совсем непонятно - можно еще контекст функции "передать" во внешний мир из тела функции. Прием называется "замыкание".   
замыкание - понятно.

А почему скрипт работает? Не понятно.
PM MAIL   Вверх
ksnk
Дата 21.6.2016, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(YahоО @  21.6.2016,  14:08 Найти цитируемый пост)
А почему скрипт работает? Не понятно. 

Потому, что переменая user описана в контексте функции. пока описание функции не завершится, или окно броузера не закроется, переменная будет существовать.
eval исполняется в том же контексте и ему доступны все переменные, в нем описанные.
Стало ли понятнее?  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
YahоО
Дата 21.6.2016, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Потому, что переменная user описана в контексте функции. 
- не понятно, потому что переменная user находится прямо в теге javascript в html и в тексте всего этого тега нет слова "функция" (function).
Почему Вы считаете что эта переменная находится в функции?


пока описание функции не завершится, или окно броузера не закроется, переменная будет существовать.
- а если и окно брнаузера не закроется и "функция" "пропадет" в случае перезагрузки этой страница на другую страницу с этого же сайта, например?


Стало ли понятнее? 
- неааа

Добавлено через 2 минуты и 10 секунд
"значение остаётся в памяти, пока на него есть хотя бы одна ссылка ... если ссылок на значение нет, то память из-под него очищается".

- значит это не работает?

Добавлено через 12 минут и 43 секунды
Например по данному коду такого вопроса не возникает:
Код

var b=function(){
 var
 user = {
  name: "Вася"
 };
};
b();
try{
 eval('al'+'ert(use'+'r.n'+'ame)');
}
catch(e){
 alert(e.name);
}


PM MAIL   Вверх
ksnk
Дата 21.6.2016, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(YahоО @  21.6.2016,  14:28 Найти цитируемый пост)
Почему Вы считаете что эта переменная находится в функции?


Цитата(ksnk @  21.6.2016,  13:21 Найти цитируемый пост)
Если явного описания функции нет - то в контексте объекта window (для броузера) 

?
Переменная, описанная внутри тега script, без использования функций будет существовать всегда, до закрытия окна или перехода на другую станицу и исключая "реинкарнации" во время перезагрузки той же страницы.

Проверить это легко - в Хроме в консоли отладки нужно ввести имя переменной и убедится в ее существовании.

В примере переменная user не существует в контексте, в котором выполняется eval, по этому при выполнении скрипта выводится ошибка. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
YahоО
  Дата 21.6.2016, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Проверить это легко - в Хроме в консоли отладки нужно ввести имя переменной и убедится в ее существовании.
- вот именно! она СУЩЕСТВУЕТ! все так, а вот почему она (переменная) без последующих ссылок на нее не уничтожена в соответствии с постулатом из "литературы"?

"Литература" здесь https://learn.javascript.ru/memory-management

Как тогда мне понять эту цитату:
"значение остаётся в памяти, пока на него есть хотя бы одна ссылка ... если ссылок на значение нет, то память из-под него очищается"
и как проверить (удостовериться) что если ссылок больше на переменную нет то память будет очищена?

Добавлено через 2 минуты и 26 секунд
Очень точный термин Вы употребили реинкарнация    smile))))))))

Добавлено через 10 минут и 37 секунд
Еще одна цитата оттуда же:
"Сборщик мусора идёт от корня по ссылкам и запоминает все найденные объекты. По окончанию – он смотрит, какие объекты в нём отсутствуют и удаляет их."

Так может Сборщик мусора так быстро не ходит, как этот мой короткий скрипт (первый) выполняется? Может нужно сделать таймаут (паузу) чтобы Сборщик мусора успел пройти и все почистить, и только потом выполнять eval чтобы user уже не было?
PM MAIL   Вверх
ksnk
Дата 21.6.2016, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(YahоО @  21.6.2016,  15:42 Найти цитируемый пост)
пока на него есть хотя бы одна ссылка

Ну, дык! Ссылка на эту переменную ЕСТЬ. Можно проверить window.user.

Постулируемая очистка переменной наступает, когда контекст функции заканчивается.  В случае, если функция не используется - не производится очистка никогда (ну, в разумных значениях этого термина  smile ) 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
YahоО
  Дата 21.6.2016, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Дочитал Литературу, есть там и такое :
"Если вы хотите вынести кому-либо мозги, дайте ему почитать эту статью. Более лютого чтива я в своей жизни не встречал. Ю_Ю"

"А когда именно сборщик мусора сработает? Сразу же или же он работает через определенное время, типа как по крону?

Всё зависит от конкретной реализации JS в браузере. Но точно не мгновенно. Алгоритмы определения интервалов через которые вызывается сборщик мусора мне неведомы. Некоторые браузеры позволяют вручную его запустить."

- ну если так обстоит дело, тогда все понятно. Это браузер !!!
PM MAIL   Вверх
YahоО
Дата 21.6.2016, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


 




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


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

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