Переменная в javascript. Нужна помощь в теории.
Хочу понять такую вещь.
Что из себя представляет переменная в js и самое главное — какой ее «жизненный» цикл.
Буду рад вашим размышлениям.
Итак. Есть html код внутри которого находится просто объявление и присвоение значения переменной js. Мы открыли эту страницу в браузере, код выполнился.
1) Почему после полного отображения страницы, выполнения всех скриптов, переменная все еще доступна? Почему мы можем в консоли браузера получить ее, изменить? Разве не должна она был быть убита, когда страница полностью загрузилась?
2) Раз переменная созданная в процессе выполнения кода в браузере все еще жива, когда страница загрузилась, то вопрос — а когда она будет удалена? В момент закрытия вкладки браузера? В момент закрытия браузера? Нигде не нашел в учебниках информации (хотя и не буду утверждать что сильно искал).
3) Да я знаю что в js есть сборщик мусора и я прочел как он работает — удаляет переменные на которые уже не ведут ссылки. Но в моем понимании это должно происходить в момент выполнения кода, разве нет? js интерпретируемый язык, интерпретатор встроенный в браузер читает его, выполняет и сборщик мусора чистит память, если на какую то переменную больше нет ссылок. Но если код выполнен, страница загрузилась, разве не должны все переменные быть очищены? Тогда в какой момент они будут удалены?
Если кто знает где почитать о js именно на таком глубоком уровне как работа с памятью, жизненный цикл переменных в браузере — буду благодарен.
Что из себя представляет переменная в js и самое главное — какой ее «жизненный» цикл.
Буду рад вашим размышлениям.
Итак. Есть html код внутри которого находится просто объявление и присвоение значения переменной js. Мы открыли эту страницу в браузере, код выполнился.
1) Почему после полного отображения страницы, выполнения всех скриптов, переменная все еще доступна? Почему мы можем в консоли браузера получить ее, изменить? Разве не должна она был быть убита, когда страница полностью загрузилась?
2) Раз переменная созданная в процессе выполнения кода в браузере все еще жива, когда страница загрузилась, то вопрос — а когда она будет удалена? В момент закрытия вкладки браузера? В момент закрытия браузера? Нигде не нашел в учебниках информации (хотя и не буду утверждать что сильно искал).
3) Да я знаю что в js есть сборщик мусора и я прочел как он работает — удаляет переменные на которые уже не ведут ссылки. Но в моем понимании это должно происходить в момент выполнения кода, разве нет? js интерпретируемый язык, интерпретатор встроенный в браузер читает его, выполняет и сборщик мусора чистит память, если на какую то переменную больше нет ссылок. Но если код выполнен, страница загрузилась, разве не должны все переменные быть очищены? Тогда в какой момент они будут удалены?
Если кто знает где почитать о js именно на таком глубоком уровне как работа с памятью, жизненный цикл переменных в браузере — буду благодарен.
Комментарии: 32
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Но нет.
«современный синтаксис» задания переменных не помещает их в свойства window.
Только test 3 заданная через устаревший var попала в window. Остальные переменные — нет. А значит почему они «живы» мне не ясно)
skillbox.ru/media/code/chem_razlichayutsya_var_let_i_const_v_javascript/
habr.com/ru/company/ruvds/blog/420359/
Я хочу понять как работает сборка мусора в javascript и какой жизненный цикл переменных в браузере, в какой момент очищается оперативная память, выделенная под определенную переменную и так далее.
Когда на нее не останется ссылок. Браузер тут вообще ни при чем, он предоставляет только интерпретатор JS.
Почитай про WeakMap и WeakSet, там подробнее объясняется про сборку мусора и вот это все.
Ну и там же есть ссылка на отдельную статью про сборку мусора.
В браузере он ничем не отличается от того же Node.js, например. В обоих случаях JS не умирает так, как ты привык об этом думать из-за php.
Задача PHP — обработать запрос, выплюнуть какой-нибудь ответ и помереть. Тот же Node.js единожды инициализируется и дальше обрабатывает сколько угодно запросов, продолжая хранить все ранее инциализированные переменные в оперативке.
Соответственно, в Node.js нельзя просто сделать условный exit (die), чтобы быстренько помереть в рандомом месте приложения и выплюнуть ответ. Это может стать сюрпризом и вызвать сложности на первых порах, но в целом это помогает грамотнее проектировать приложение и уделять больше внимания его циклу жизни.
два момента только:
— в учебниках крайне мало уделяется внимания именно этому аспекту, поэтому и спрашиваю у более опытных.
— плюс мне кажется что js в браузере и js на сервере это немного разные вещи. У них одинаковый синтаксис но разная идеология, нет? node js это прежде всего процесс в операционной системе, он регистрируется как сервис (по крайней мере в линуксе) и понятное дело — работает постоянно. js в браузере — это лишь код, которые обрабатывается встроенным в браузер интерпретатором. И мне сложно представить что он единожды инициализируется и дальше работает.
Да, конечно, различия есть, но эти различия — особенности среды исполнения, а не какие-то «фишки языка». Язык работает одинаково как в хроме, так и в ноде, потому что там работает один и тот же интерпретатор v8.
Опять же, тебе не нужно фокусироваться на этих различиях, если ты не пишешь серверную часть на ноде.
Если так уж интересно, то по такому принципу работает консоль в браузере.
Знаете что еще немного удивляет в js — это отсутствие официальной документации.
Я ведь не ошибаюсь — ее нет? У php есть php.net документация на котором ведется разработчиками, у python есть python.org, но я не встречал официального сайта по js (ну и кстати по CSS тоже). Есть learn.javascript есть mozilla MDN (но mozilla само по себе open source сообщество и это как я понимаю просто ребята молодцы и своими силами собирают в одном месте информацию), есть кучи статей на хабре или видео на ютубе, но ни одного сайта не видел который можно было назвать официальным и первоисточником.
В 99% случаев вам будет удобнее всего ориентироваться на MDN, там все неплохо структурировано, и поддерживается в довольно актуальном состоянии.
То что вы говорите, событие пользователя и прочее — все это асинхронность выполнения кода.
Есть вот такой сайт
latentflip.com/loupe/
на котором наглядно отображается так называемый event loop для javascript в браузере, видно как асинхронные события помещаются в апи браузера, ждут наступления события, в то время как основной поток идет себе синхронно и так далее. И если в nodejs код всегда асинхронный, то в браузере (насколько я понимаю) нет, он наоборот всегда синхронный. Иначе нам не приходилось бы добавлять атрибут defer при подключении скрипта. При условии что мы не создаем асинхронности сами — добавляем промисы, колбеки и так далее.
Поэтому мне казалось что было бы логично, что если весь код состоит из объявления и присвоения переменной, то после выполнения кода — прибить эту переменную в памяти. Но это так… лишь мои домыслы, а практика показывает что нет — все переменные продолжают храниться в оперативной памяти.
А в каком тогда случае очищается память? Это где то задокументировано, вам попадалась такая инфа? При перезагрузке страницы? При закрытии вкладки?
Очень рекомендую уроки по JS Владилена Минина. У него превосходный канал на Ютубе с отличным контентом и есть полноценные курсы начиная от основ JS до всевозможных фреймворков. Ну и практика конечно.
www.youtube.com/watch?v=vIZs5tH-HGQ
Хотя у меня уже есть начальные знания о javascript, я прохожу учебник learn.javascript.ru/ пошагово, с первой главы. Иногда честно через силу, конкатенирую строчки, пишу if ы и прочий первоначальный синтаксис, хотя тянет сразу перейти к тому, что совсем прошло мимо меня — классы в js, модули, импорты экспорты и прочее. Но пока держу себя в руках.
Когда нужно понять как работает та или иная функция и так далее.
Все-таки учебник Кантора — это более учебное пособие, где после каждой главы есть закрепляющие занятия.
А почему в таком вот цикле (объект user заранее создан)
и key и element объявлены через const, хотя на каждой итерации они будут изменяться и при этом — ошибок не возникает?? Вот в моем понимании там может быть только let element =
2. Переменные имеют область видимости. Она ограничена круглыми или фигурными скобками. Читаем область видимости. Попробуй вызови в консоли element за пределами ближайшей фигурной скобки
3. Как только область видимости заканчивается — сборщик мусора уничтожает переменную и ее можно объявить заново. В цикле можно заново объявлять переменные на каждой итерации. Читаем про сборщик мусора.
4. Есть такое правило ВСЕГДА использовать const при объявлении переменной. Это связано с тем что далее нельзя будет изменить ее тип и при объявлении четко понятно какого типа переменная. Исключение — если изначально понятно что переменная ниже будет перезаписана. И это объявление тоже служит сигналом для читающего код что где то ниже переменная будет перезаписана. Таким образом const и let это еще и информация о судьбе переменной. Будет ли ниже ее изменение.
Но вы безусловно правы.
Опять таки, дилетансткое мнение ни о чем кроме размышлений не основанное, но мне кажется что в js так прижился const что даже стал негласным правилом, только потому что 90 процентов случаев в переменных лежат не примитивы, а объекты, а их свойства и методы можно менять и у const. И вроде как всем удобно. Потому как концепция «неизменяемая переменная» это странная идея и вообще — оксюморон какой-то.
Тоесть я так понимаю, что в классическом цикле for const не прокатит, изза того что мы переменную i на каждой иттерации увеличиваем, а значит нам нужна ссылка на нее в памяти?
Так плохо
а так хорошо
Ну скорее значение? Тип понятное дело не измениться если нельзя заменить даже значение, но Боже мой, а с каких пор js стал языком со строгой типизацией? Такое чувство что из него C++ начали делать.
Неа. Именно тип. Значение двух типов менять можно. Это массив и объект. Мы запросто можем манипулировать их внутренностями.
Это то же самое, что написать
Именно поэтому используют let.
Ты можешь использовать хоть var, но такой код никто не захочет читать и поддерживать. У const и let масса преимуществ перед var. Именно из-за них их и используют. Почитай про hoisting.
Отчего же это?
я вроде бы именно это и написал, только без термина мутирования. Я написал «const не прокатит, изза того что мы переменную i на каждой итерации увеличиваем»
— вроде бы тоже самое и я написал, что если язык позволяет так делать, то значит это НЕ есть «правило языка», это «культура написания кода», когда ты делаешь код гармоничнее и для себя и для потомков.
Лишь мои размышления. Название «переменная» намекает на изменяемость. Переменная должна «переменятся» или хотя бы иметь такую возможность.