Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 23.07.2012, 18:40
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от Deff
Ксать забавно - можно даже избегая замыканий иметь кучу переменных
не видимых в глобале
В данном случае все три - глобальные, или что имелось в виду?
Ответить с цитированием
  #12 (permalink)  
Старый 23.07.2012, 20:55
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

1) Есть ссылочные типы, и есть примитивные. Если в переменной содержится значение примитивного типа, значит в ней хранится само значение. В случае со значениями ссылочного типа в переменных хранятся ссылки на значение, т.е. сами данные хранятся отдельно.

Например, массив - ссылочный тип.

var a = [1, 2, 3];   // создали массив и записали ссылку на него в переменную a
var a = [];   // создали пустой массив и записали ссылку на него в переменную a
// старый массив никуда не исчез, просто на него сейчас нету ни одной ссылки


В результате, передавая переменные ссылочного типа в функции, ты можешь их изменить в отличие от примитивных типов:
var a = 1, b = [2, 3, 4];
function f(c, d) {
    c = 2;   // a не изменилась
    d.splice(0, 1);   // b изменилась
}
f(a, b);
alert([a].concat(b));


Примитивные типы - числа и true/false, по поводу строк - неизвестно, потому что их нельзя изменить. Остальное ссылочные типы. Number и Boolean - тоже ссылочные типы, потому что это объекты.

2) Сборщик мусора это такая штука, которая время от времени запускается и освобождает память, занятую переменными, которые нигде не используются.
var a = [1, 2, 3];   // создали массив и записали ссылку на него в переменную a
var a = [];   // создали пустой массив и записали ссылку на него в переменную a
// старый массив никуда не исчез, просто на него сейчас нету ни одной ссылки
// через какое-то время сборщик мусора освободит память, занятую массивом [1, 2, 3], другими словами старый массив "исчезнет"



Сообщение от 9xakep
devote,
Ну это тогда уже от задачи, мне может и надо очистить один массив
Следовательно, a = [] не очищает массив.

Сообщение от Deff
Ксать забавно - можно даже избегая замыканий иметь кучу переменных
не видимых в глобале
Именно поэтому рекомендуется создавать все переменные с помощью var. Если вы видите в коде переменные, объявленные без var, значит либо 1) автор очень умный, либо 2) автор очень "умный"
Ответить с цитированием
  #13 (permalink)  
Старый 23.07.2012, 21:30
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от x-yuri
Именно поэтому рекомендуется создавать все переменные с помощью var
Чтобы переменная не оказалась глобальной, ещё и в пределах некоторой функции.
Ответить с цитированием
  #14 (permalink)  
Старый 23.07.2012, 22:07
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

А что с циклическими ссылками? И что, сборщик мусора, основанный на подсчете ссылок используется во всех движках?
Ответить с цитированием
  #15 (permalink)  
Старый 24.07.2012, 05:10
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от Дзен-трансгуманист
Хотите сказать, что в JS могут возникать ссылки на другие ссылки? Не верю, покажите пример.
В процессе работы программы на Джаваскрипте может случиться такое, что образуется некоторая группа объектов, каждый из которых имеет ссылку на него, но все ссылки на них принадлежат объектам из этой же группы, то есть эта группа объектов оказывается отрезанной от внешнего мира.
Пример 1:
var a={};
a.x=a;
a=null; //объект, на который раньше ссылалась переменная a оказывается отрезанным.

Пример 2:
var a={}, b={};
a.x=b;
b.x=a;
a=b=null; //объекты, на которые раньше ссылались переменные a и b, оказываются отрезанными от внешнего мира.

Будут ли подобраны эти объекты сборщиком мусора, я не знаю, самому интересно.
Ответить с цитированием
  #16 (permalink)  
Старый 24.07.2012, 15:32
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от Дзен-трансгуманист
Мусор-таки выметается - видно по индикатору свободной памяти в системе. Однако и сжирает 16 метров, то есть по 80 байт на объект.
По индикатору свободной памяти в системе? Почему не по памяти занятой процессом? Всегда подобные времяпровождения казались немного бессмысленными. Очевидно, что при удалении переменной, браузер на обязан освобождать память в систему. Т.е. должна присутствовать какая-то инертность. При чем алгоритм наверняка еще сложнее.

Сообщение от Дзен-трансгуманист
Просто не может такого быть, чтобы наличие ссылок определялось брутальным обходом - это была бы виселица попросту.
Кто говорит про брутальный обход? И я что-то не слышал, что mark and sweep сборщики признаны непригодными к использованию. В .net и java используются именно такие сборщики, насколько я знаю.
Ответить с цитированием
  #17 (permalink)  
Старый 24.07.2012, 21:05
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,501

Сообщение от x-yuri Посмотреть сообщение
В .net и java используются именно такие сборщики, насколько я знаю.
И то и то слвится своим "быстродействием".)
__________________
29375, 35
Ответить с цитированием
  #18 (permalink)  
Старый 25.07.2012, 00:23
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от Aetae
И то и то слвится своим "быстродействием".)
Про java слышал, что до сих пор славится по инерции, типа оснований для этого уже нету. Про .net вообще не слышал такого.

Сообщение от Дзен-трансгуманист
Одно из свойств этой техники состоит в том, что на время сборки мусора исполнение программы полностью останавливается, что не всегда хорошо.
Сообщение от rsdn
Concurent GC – это второй вид оптимизации процесса сборки мусора. Его суть заключается в том, что процесс построения графа объектов ведется без приостановки управляемых потоков. Вместо этого запускается специальный GC-поток, строящий граф. Поскольку в любой момент управляемые потоки могут изменить граф и вообще пересечься с GC-потоком, требуется синхронизация со всеми операциями, модифицирующими управляемые ссылки. Естественно, что параллельный GC-поток и необходимость синхронизации (подробнее см. раздел «Барьер записи») не могут не замедлить процесс сборки мусора по сравнению с обычной схемой. Однако во многих случаях такое замедление незаметно. Зато это позволяет избавиться от паузы, вызванной построением графа объектов. Малый размер пауз выгоден для интерактивных приложений. Особенно в нем нуждаются GUI-приложения и игры. Не мудрено, что именно этот режим используется в .NET Framework по умолчанию.
http://www.rsdn.ru/article/dotnet/GC.xml#ENE

Там же написано про поколения, т.е. нету необходимости обходить все переменные.

Контрольный: почему они выбрали mark and sweep если подсчет ссылок такой весь из себя положительный?

Сообщение от Дзен-трансгуманист
Чем больше смотрю на работу браузеров, тем больше мне кажется, что почти все они сделаны через жопу.
Я думаю, надо написать свой браузер, чтобы понять разработчиков браузеров
Ответить с цитированием
  #19 (permalink)  
Старый 25.07.2012, 12:31
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от Дзен-трансгуманист
Да, отличный способ избавиться от лишней головной боли в связи с неумением представить задачу в виде конечного автомата.
Вы так хорошо разбираетесь... вам надо непременно отправить своё резюме в microsoft или sun, пока они не просрали все полимеры.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить элемент из массива, не убирая с экрана KamalovRadik Javascript под браузер 0 15.10.2011 12:48
как найти и удалить массив из массива? FRIE Общие вопросы Javascript 8 14.03.2011 15:48
Изменить содержимое элементов, Или удалить сами улементы muratti Events/DOM/Window 7 01.12.2010 08:38
Как удалить повторные элементы из массива? YISHIMITSY Общие вопросы Javascript 1 04.05.2010 00:04
Как удалить элемент массива? velo Общие вопросы Javascript 2 05.02.2010 15:58