как ECMAScriptv5, каждый раз, когда элемент управления вводит код, механизм создает LexicalEnvironment (LE) и VariableEnvironment (VE) для кода функции , эти 2 объекта являются одной и той же ссылкой, которая является результатом вызова NewDeclarativeEnvironment ( ECMAScript v5 10.4.3 ), и все переменные, объявленные в коде функции , хранятся в запись среды компонент VariableEnvironment ( ECMAScript v5 10.5 ), и это основная концепция закрытия .
Что меня смутило, так это то, как Garbage Collect работает с этим подходом к закрытию. Предположим, у меня есть такой код:
function f1() {
var o = LargeObject.fromSize('10MB');
return function() {
// here never uses o
return 'Hello world';
}
}
var f2 = f1();
после строки var f2 = f1 ()
, наш граф объектов будет выглядеть так:
global -> f2 -> f2's VariableEnvironment -> f1's VariableEnvironment -> o
так что, насколько мне известно, если механизм javascript использует метод подсчета ссылок для сборки мусора, объект o
имеет в аренде 1 ссылку и никогда не будет GCed. По-видимому, это приведет к пустой трате памяти, поскольку o
никогда не будет использоваться, но всегда хранится в памяти.
Кто-то может сказать, что движок знает, что f2's VariableEnvironment не использует f1's VariableEnvironment , поэтому все f1's VariableEnvironment будет GCed, поэтому есть еще один фрагмент кода, который может привести к более сложной ситуации:
function f1() {
var o1 = LargeObject.fromSize('10MB');
var o2 = LargeObject.fromSize('10MB');
return function() {
alert(o1);
}
}
var f2 = f1();
в этом случае f2
использует объект o1
, который хранится в f1's VariableEnvironment , поэтому VariableEnvironment f2 должна содержать ссылку на f1's VariableEnvironment , в результате чего o2
также не может быть GCed, что еще больше приводит к нерациональной трате памяти.
поэтому я хотел бы спросить, как современный движок javascript (JScript.dll / V8 / SpiderMonkey ...) справляется с такой ситуацией, существует ли стандартное указанное правило или оно основано на реализации, и каков точный шаг движка javascript обрабатывает такие граф объекта при выполнении сборки мусора.
Спасибо.