Pull to refresh
8K+
0

Fullstack-разработчик

4
Rating
1
Subscribers
Send message

Массив о-о-очень большой

Если ещё один нолик добавить к размеру массива, то владка ложится с сообщением о нехватке памяти. Хотел таким образом спровоцировать сборщик мусора на активную работу. Получилось только браузер нагрузить

Вот если бы две последних строки в блок завернули. То, всё было бы мило

Не совсем вкурил, а как блоки тут влияют?

Но, сборщик ведь убил те два объекта?

Да, разумеется. В примере со вторым большим объектом, иногда при первом открытии страницы, сборщик убивает их практически сразу после завершения загрузки. Но при перезагрузках уже этого воспроизвести не удаётся и они удаляются только спустя какое-то время

Теперь всё точно понял. Спасибо Вам)

 Когда движку может скоро не хватить памяти и надо её почистить

Попробовал изменить Ваш пример добавив ещё один большой массив в конце:

let myGarbage = new FinalizationRegistry((held) => {
  console.log('held\t' + held)
})

function clickSetup(btn, message) {
  const bigData = new Array(1000000).fill(message)

  myGarbage.register(bigData, 'bigData')
  myGarbage.register(btn, 'btn')

  btn.addEventListener('click', () => {
    console.log(message, bigData.length)
    btn.remove() // Удаляем из DOM
  })
}

{
  const elem = document.getElementById('myElem')

  clickSetup(elem, 'Клик!')
  elem.click()
}

const bigData2 = new Array(100000000).fill(1) // Создаём ещё один большой объект

console.log(bigData2)

Страница начинает мощно тупить, комп готовится на взлёт, а сообщения от FinalizationRegistry(), всё так-же появляются с около минутной задержкой

arr не попал в копилку

Точняк. Наверное потому что arr не используется в замыкании, а вот если его там задействовать то он появится в Scopes :

function make(arr, data) {
    console.log(arr.find((item) => {
		console.log(arr) // Используем аргумент arr
		return item === data
	}));

    return () => {}
}

const func = make([2], {x: 1})

console.dir(func) // Теперь тут будет arr

Видимо у всех замыканий внутри функции общее окружение

Это потому, что все упоминаемые во внутренних функциях объекты садятся в одну "лодку"

Пустая внутренняя функция тащит за собой всё окружение родителя без разбору. Прикольно чё. Спасибо Вам)

elem находится в блоке и будет удален. Соответственно DOM объект будет без внешних ссылок и сборщик его прибьёт. Через некоторое время будет об этом сообщение

Попробовал Ваш код. Сборщик срабатывает прям не быстро, где-то через минуту или даже немного больше. То есть какой-то детерминированности тут нет. И если иметь дело с реальным кодом, а не лайтовыми демонстрациями, приложение будет лагать, пока сборщик не очухается. Но идея интересная, спасибо Вам)

Но есть ряд выражений, где если явно не отделять точкой запятой, то будет баг

Мне тоже о таком известно. В частности не рекомендовал бы пренебрегать точками с запятой если код пишется в теге <script>, особенно если его ещё и генерит какой нибудь PHP, добавляя свои вставки. Тут запросто разрыв строки, который в файле есть, в браузере может потеряться и вызвать ошибку. В остальном пока проблем в коде без точки с запятой, пока не встречал

Поправил. Спасибо за замечание

по сути - «приватная переменная в классе»? у-а-у, как круууто... джаваскриптеры создали приватные переменные

По сути всё так. JavaScript лишь частично и очень специфично реализует ООП. Многим кто привык к ООП в более классическом варианте, это не нравится и для них придумали TypeScript. Замыкания это лишь один из вариантов как на JS можно декомпозировать код с инкапсуляцией состояния

автор из идейных соображений не завершает выражения точкой с запятой

В JavaScript этот момент опционален, так что я её и не использую. Мне и так понятно: кончилась строка, кончилось выражение, точка с запятой лишняя и код без неё становится только лучше, аки питоновский

Вот эти ваши (.бурж Source)

Просто юмор, подрезанный мной из слега SEOшников

Как вы получили доступ к переменной в замыкании из консоли?

Очень просто, в коде же есть точка остановы во внутренней функции, так что все переменные существующие на момент остановки, будут доступны в консоли. Но в целом проблему неочевидности этого понял и текст поправил. Спасибо за замечание)

Еще одна миллионная статья на тему замыкания?

Искренне не понимаю этой претензии. Может из-за уровня духоты в помещении где Вы находитесь, Вам плохо видно монитор, но это лайтовая гиговская площадка, а не серьёзный научный журнал с рецензированием. Тут нет требований к абсолютной уникальности тем. К тому-же пробегался по некоторым статьям на тему в хабре. И там по сути, был унылый и сухой копипаст с мозилы, написанный в духе инструкции к кофеварке. Я решил зайти с несколько другой стороны, взглянув на замыкания более широко

undefinde

Спасибо больше. Поправил)

Затенение

Используйте var

А тут что не так?

каких ещё ЯП есть что-то более изумляющее чем var+let и name

В том и суть JS, он создан чтобы изумлять)

Это называют Temporal Dead Zone

Вот да. Ладно бы я про это ещё не написал, то претензия была бы хоть сколько-то уместна. Но в статье есть отдельный блок о TDZ, но судя по всему @eandr_67 только вступительный абзац осилил

Использовать функции до их объявления можно во множестве языков программирования

То что функцию можно вызвать раньше её объявления, это неравно всплытию в JavaScript. Просто компилятор пыхи добр и снисходителен к инвалидам по уму. А с переменными сработает?

Тут опечатка?

Да. Спасибо Вам. Поправил

там идея в том что память общая и потоки могут в ней работать одновременно и возможны гонки?

Да, ситуация в которой 2 потока могут обращаться к одной и той-же области памяти имеет риск возникновения гонок. Собственно обезопаситься от таких ситуаций можно при помощи Atomics

так что любовь ли это?

Неразделённая)

Information

Rating
1,331-st
Registered
Activity

Specialization

Фулстек разработчик
JavaScript
Vue.js