Механика памяти с областью действия - PullRequest
2 голосов
/ 05 декабря 2011

Если я сделаю что-то вроде

// global scope
function stuff() {
    // local scope
    var a = new SomeHugeMemoryHog();
}

// a doesn't exist down here, but what happened to the memory from the "stuff" scope?

Буду ли я создавать утечку памяти, если я не установлю a = null в конце области действия stuff?Или я не должен волноваться об этом?Я задаю этот вопрос с акцентом на создание DOM объектов (таких как canvas) внутри области функций (которые я не использую позже в любое время).Я использую только холст, чтобы получить векторные размеры.

Ответы [ 4 ]

3 голосов
/ 05 декабря 2011

Как уже отмечали другие, поскольку вне функции нет ссылки на a, сборщик мусора будет собирать ее, скорее всего, при следующей сборке.

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

function stuff() {
    var a = new SomeLargeObject();
    $("#somediv").click(function () { /* something */ });
}

Даже если вложенная функция не использует a.a может остаться в живых, потому что запись активации stuff все еще жива.Кроме того, объекты DOM могут быть собраны не так, как обычные объекты JavaScript, что может привести к тому, что они станут восприимчивыми круговыми ссылками, что вызовет проблемы с коллекцией.Это наиболее проблематично в старых браузерах, и поскольку вы ссылаетесь с помощью браузеров Canvas, которые поддерживают Canvas, как правило, они более современные и правильно обрабатывают циклические ссылки, а также позволяют собирать локальные переменные, не захваченные замыканием.

3 голосов
/ 05 декабря 2011

Нет, мусор должен собираться, если на него больше нет ссылок.

1 голос
/ 05 декабря 2011

Тебе не стоит об этом беспокоиться.a будет локальным глобалом в функции stuff () (и будет видимым для любого кода, который запускается «ниже», но не будет виден вне вызова stuff ().

например,

<script>
// a does not exist here

function stuff() {
   // no a here
   var a = new SomeHugeMemoryHog(); // a will be set once SomeHugeMemoryHog is created and the constructor returns
   // a exists here
}

// no a here either

stuff(); // a exists while stuff is running

// a has gone out of scope and will be cleaned up.

</script>
0 голосов
/ 05 декабря 2011

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

var someObj = new stuff();

В противном случае переменная a будет собирать мусор.

...