Javascript по ссылке и памяти

Ребята , я пытаюсь выучить JavaScript, и у меня есть вопрос, который я считаю важным задать. так что я получил так далеко, что когда я делаю что-то вроде этого:

var a=function(){} 

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

так что же происходит со старым местом, на которое указывал a (с неопределенным значением)? также, если я установлю b равно a это означает, что они будут указывать на один и тот же слот памяти, верно?

что случилось со слотом, на который ранее указывал b?

наконец, функция сохраняется в памяти на этапе создания, но не может быть вызвана, потому что ничто не указывает на нее, или ее просто сохраняют на этапе выполнения?

спасибо, я надеюсь, что вы можете помочь мне прояснить мои мысли (я не могу спать с этими вопросами на моей голове:D)

3 ответа

Решение

так что же происходит со старым местом a указывал на (с неопределенным значением)?

Я не знаю точных деталей каких-либо движков JavaScript, но подозреваю, что на самом деле таких слотов нет. Вместо, undefined вероятно, это просто особое значение, которое помещается в a это указывает на то, что оно никуда не указывает (аналогично NULL в с).

Если там действительно есть слот памяти для undefined, это один объект, на который указывают все неопределенные переменные. С этим ничего не происходит, так как на него все еще много других переменных.

также, если я установлю b равным a, это означает, что они будут указывать на один и тот же слот памяти, верно?

Да. Когда вы назначаете переменные в JavaScript, он просто копирует ссылку.

что случилось со слотом, на который ранее указывал b?

Если что-то еще указывает на это, ничего. Если ничто иное не указывает на него, сборщик мусора в конечном итоге восстановит свою память.

наконец, функция сохраняется в памяти на этапе создания, но не может быть вызвана, потому что ничто не указывает на нее, или ее просто сохраняют на этапе выполнения?

Это сохраняется при создании. Можно создать функцию, даже не назначая ее переменной - это общая идиома, называемая выражением немедленного вызова функции:

(function() { console.log("Function is running"); })();

Эта функция создается, вызывается, а затем становится недоступной. Сборщик мусора в конечном итоге восстановит его.

var a=function(){}

Это не создает указатель на undefined, а затем переназначает его в функцию. Это прямо указывает на функцию.

Даже если вы сделали

var a;
a = function(){};

a не указывает на случайное место в памяти, которое содержит неопределенное. А не определено. Не определено это значение. И затем вы назначаете его со ссылкой, указывающей на функцию. Undefined не нужно очищать, потому что он подставляется.

Кроме того, базовые значения копируются, на них нет ссылок, поэтому:

A = 50; var B = 75; A = B;

Не использует 3 ячейки памяти, только 2, удерживая сначала 50 и 75, а затем 75 и 75.

Если бы это были объекты, то это были бы ссылки. Что происходит с объектами, когда на них нет ссылок, так это то, что они удаляются сборщиком мусора, что является процедурой, освобождающей память от объектов, на которые больше никто не ссылается.

Я думаю, я понимаю, что вы пытаетесь спросить. Если у вас есть переменная в JavaScript или любой другой язык программирования, имеющий собственный сборщик мусора, и вы ссылаетесь на часть в памяти... например, допустим, var A = 50; var B = 75;

и вы хотите развернуться и переназначить A = B;

Место памяти будет освобождено, и теперь А будет 75.

Вот некоторая документация, которая может объяснить более подробно: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

Другие вопросы по тегам