2014-02-14 5 views
2

Будет ли переменная в следующем примере (собака) по-прежнему существовать после завершения работы функции?Сохраняются ли локальные переменные в анонимных функциях?

(function(){ 
    var dog=1; 
})(); 

Это в основном из любопытства, хотя это может быть полезно в AJAX-приложениях с бесчисленными такими переменная. Не то, чтобы запасной вес ломал любые спины, но это сильно мешало бы разработчику знать, что у него есть запасные переменные. Кроме того, есть ли название для этих переменных?

+0

Да и нет; когда сборщик мусора смотрит, существуют ли какие-либо ссылки для '1', вы назвали' dog', он не найдет никого и очистит его, но до этого или если алгоритм GC плохой, тогда память все еще будет использоваться. Если в вашем коде есть много переменных, которые не будут уничтожены должным образом, говорят, что у них есть «утечка памяти», но этого не произойдет в примере, который вы указали. –

+0

Нет, 'var dog' будет находиться внутри функции и может быть уничтожен, когда он будет завершен. если вы опустили ключевое слово 'var',' dog' будет неявным глобальным и на самом деле будет сохраняться! – roo2

ответ

3

С точки зрения сбора мусора, нет никакой разницы между анонимными и именованными функциями:

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

2

No, var dog будет находиться внутри функции и может быть уничтожен, когда он будет завершен. если вы опустили ключевое слово var, dog будет неявным глобальным и на самом деле будет сохраняться!

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions_and_function_scope

частное состояние функции также может быть сохранены using closures

Смежные вопросы