Сколько памяти требуется var?
Мы никогда не узнаем.Он может варьироваться от ничего до нескольких байтов .Это зависит от движка и шагов оптимизации, которые он принимает.Возьмите этот пример:
function test() {
var unused = "stuff";
}
В этом случае unused
не может использоваться, и компилятор может решить полностью его оптимизировать, тогда он занимает без памяти .Однако, если вы добавите точку останова в эту функцию, она должна вернуться к неоптимизированной версии и выделить unused
.
Или принять следующее:
function addOne(n) { return n + 1; }
var test = addOne(2);
test = addOne(3);
Компилятор может оптимизироватьэто может быть сделано несколькими способами:
1) Это ничего не оптимизирует, тогда n
может содержать любое возможное значение JavaScript, поэтому, вероятно, оно ссылается на какой-то суперкласс "value" ,Ссылка займет несколько байтов, как и сам экземпляр класса.
2) Предполагается, что n
всегда является числом (потому что он видел это из вызовов), и генерирует оптимизированный байт-код, который тольковыделяет число (или целое число) в стеке.Это займет 8 байтов (может быть меньше / больше).
3) Она полностью содержит функцию, n
вообще не существует.В результате получается код:
var test = 2 + 1;
test = test + 1;
Теперь, если вы, однако, делаете addOne("test")
, он должен либо вернуться к неоптимизированной версии, либо сгенерировать новую оптимизированную версию для строк.
Поскольку это то, что делают все (большинство) движков, вы никогда не знаете, сколько места занимает переменная, поскольку она может изменяться (несколько раз) во время выполнения.Он может даже меняться в зависимости от того, как вы его называете, когда вы вызываете eval
или with
когда-нибудь, и когда вы используете отладчик, чтобы «просматривать» функции.
Для глобальных переменных (как в вашемслучай) вероятно, что механизм не может выполнить оптимизацию (так как с ним может взаимодействовать столько частей кода), поэтому, вероятно, применяется случай 1.
Когда эта память выделяется для переменной?
Либо никогда , либо когда вы вызываете функцию , либо для глобальной области: , когда код анализируется ,или при достижении назначения .
// assuming a non optimized case:
function test() { // a reference holder for a gets allocated
let a;
a = {}; // an object gets allocated, a reference to it gets stored in the already allocated slot
}
Приведенные выше оптимизации хорошо документированы для V8, который работает в Chrome и NodeJS среди других.