Использует var foo = function foo() {}; выражение, создающее утечку памяти в IE <9?
Я знаю, что эта форма:
var foo = function bar() {};
приведет к утечке имени bar
в область приложения и созданию двух функций в jscript
.
Как насчет:
var foo = function foo() {};
?
Он по-прежнему просачивает имя в область охвата, но он там все равно (от спасибо до var foo
).
Я знаю, что он будет определен во всей области видимости, но будет ли он создавать две функции и немедленно разыгрывать или уничтожать одну из них или это все еще вызывает утечку?
В этой ситуации:
var bar = function() {
foo();
var foo = function foo() {};
}
Будет ли у нас два объекта функции внутри bar()
?
изменить
Хорошо, что он определенно создает два функциональных объекта, теперь возникает вопрос: выполняет ли функция, созданная с помощью именованного определения, разыменоваться и очищается GC после строки var foo
, поэтому существует не более одного "живого" foo
экземпляр в любой момент в коде выше?
Или IE будет IE, чтобы он не висел навсегда, так как нет способа "разыменовать" foo
, созданного определением, и его вообще не должно быть там?
Ответы
Ответ 1
При анализе оператора var foo = function foo() {};
объявление var foo
, скорее всего, назначается после function foo(){}
.
Это означает, что function foo
будет определяться в глобальной области, обычно это window
.
После этого присваивается var foo
и, таким образом, скрывает window.foo
из области видимости для имени foo
. Таким образом, ваш код определяет window.foo
или window.bar
, который не является сборкой мусора, если оставлена текущая область.