Подтвердить что ты не робот

Использует 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, созданного определением, и его вообще не должно быть там?

4b9b3361

Ответ 1

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

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

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