Время жизни переменных JavaScript - PullRequest
9 голосов
/ 22 апреля 2010

Каково время жизни переменной в JavaScript, объявленной с помощью "var". Я уверен, что это определенно не соответствует ожиданиям.

<script>
function(){
   var a;
   var fun=function(){
     // a is accessed and modified  
     }
}();


</script>

Вот как и когда сборщик JavaScript собирает переменную a? Поскольку a является частью замыкания внутренней функции, в идеале она никогда не должна собирать мусор, поскольку внутренняя функция fun может передаваться как ссылка на внешний контекст. Таким образом, fun все еще должен иметь доступ к a из внешнего контекста.

Если мое понимание верно, как происходит сборка мусора и как он обеспечивает достаточное пространство памяти, поскольку сохранение всех переменных в памяти до тех пор, пока выполнение программы не может быть надежным?

Ответы [ 2 ]

4 голосов
/ 22 апреля 2010

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

Ознакомьтесь с этой статьей о разрешении идентификаторов, замыканиях, цепочке областей действия и сборке мусора в ECMAScript.

Надеюсь, это поможет

1 голос
/ 22 апреля 2010

'a' не будет собирать мусор, пока есть внешние ссылки на 'fun'. Браузер гарантирует, что у него достаточно памяти, запрашивая у ОС больше памяти.

...