2013-05-30 1 views
13

Я знаю, что эту форму:Использует var foo = function foo() {}; выражение, создающее утечку памяти в IE <9?

var foo = function bar() {}; 

просочится имя bar в области видимости и создать две функции в jscript.

Как насчет:

var foo = function foo() {}; 

?

Он по-прежнему просачивает название в область охвата, но он все равно там (от thx до var foo).

Я знаю, что он будет определен во всей области видимости, но будет ли он создавать две функции и сразу разыгрывать или уничтожать одну из них или это все еще вызывает утечку?

В этой ситуации:

var bar = function() { 
    foo(); 
    var foo = function foo() {}; 
} 

Будет ли у нас есть две функциональные объекты внутри bar()?

редактировать

Хорошо это определенно создает две функциональные объекты, теперь вопрос: имеет ли функция, созданная по имени определению получить разыменованных и убрала с помощью ГХ после var foo линии, так что не больше, чем one 'live' foo экземпляр в любое время в коде выше?

Или IE будет IE оставить его болтающимся навсегда, так как нет никакого способа «разыменовать» созданный по определению foo, и его даже не должно быть там в первую очередь?

+0

«в IE» ... только что это было исправлено с IE9 ... – Christoph

+0

@ Christoph изменил вопрос, thx – soulcheck

+6

http://kangax.github.io/nfe/ – Ven

ответ

1

При разборе заявление var foo = function foo() {};, то var foo заявление, скорее всего, назначается послеfunction foo(){} выполняется.

Это означает, что function foo будет определяться в глобальном масштабе, обычно window.

После этого var foo присваивается и, таким образом, скрывает window.foo из вашей области действия для имени foo. Таким образом, ваш код определяет window.foo или window.bar, что не является сборкой мусора, если оставлена ​​текущая область.

+0

Почему функция должна быть определена в глобальной области? –

+0

Потому что 'function foo() {}' ведет себя как 'foo = function() {}' будет. И 'foo = something;' без оператора 'var' фактически будет определять' window.foo', тогда как глобальная область - это 'window', которая по умолчанию используется для сценария браузера. – dronus

+0

Это означает, что каждое объявление функции является глобальным, что неверно. 'function foo() {}' is ** не ** эквивалентно 'foo = function() {}'. –