С точки зрения сбора мусора, нет никакой разницы между анонимными и именованными функциями:
function dostuff(){
var dog = {};
}
dostuff();
В ваш конкретный пример, dog
выходит из области действия, когда заканчивается ваша функция. Поскольку ничто другое не указывает на этот объект, это должен быть сбор мусора.
Однако, если есть внутренние функции, тогда некоторые из переменных могут быть сохранены внутри закрытий и не собирать мусор;
function dostuff(){
var dog = {name:"dog"};
var cat = {name:"cat"};
setInterval(function(){
console.log(dog.name);
}, 100);
}
В этом случае собака упоминается в обратный вызов, который вы передали setInterval так эта ссылка получает сохраняются при DoStuff выходов и не будет мусора. Что касается переменной cat
, это зависит от реализации. В некоторой реализации заметим, что cat
не используется ни в одной внутренней функции и будет мусор собирать его содержимое. Однако некоторые другие реализации сохраняют все переменные в области видимости, даже если только одна из них используется во внутренней функции.
Для получения дополнительной информации, см это: How JavaScript closures are garbage collected
Да и нет; когда сборщик мусора смотрит, существуют ли какие-либо ссылки для '1', вы назвали' dog', он не найдет никого и очистит его, но до этого или если алгоритм GC плохой, тогда память все еще будет использоваться. Если в вашем коде есть много переменных, которые не будут уничтожены должным образом, говорят, что у них есть «утечка памяти», но этого не произойдет в примере, который вы указали. –
Нет, 'var dog' будет находиться внутри функции и может быть уничтожен, когда он будет завершен. если вы опустили ключевое слово 'var',' dog' будет неявным глобальным и на самом деле будет сохраняться! – roo2