正在使用var foo = function foo() {};在IE中创建内存泄漏的表达式<9.

Is using var foo = function foo() {}; expression creating a memory leak in IE < 9?

本文关键字:foo 内存 泄漏 创建 表达式 IE var function      更新时间:2023-09-26

我知道这个表单:

var foo = function bar() {};

将把bar的名称泄露给封闭作用域,并在jscript中创建两个函数。

var foo = function foo() {};

?

它仍然泄漏的名称封闭作用域,但它在那里无论如何(感谢var foo)。

我知道它将在整个范围内定义,但它会创建两个函数并立即解引用/销毁其中一个,还是这仍然会导致泄漏?

在这种情况下:

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

bar()内部会有两个函数对象吗?

编辑

Ok,它绝对创建了两个函数对象,现在的问题是:由命名定义创建的函数是否在var foo行之后被GC解引用和清理,所以在上面的代码中任何时候都没有超过一个"活动"的foo实例?

或者IE会让它永远悬空,因为没有办法"解引用"由定义创建的foo,它甚至不应该在那里?

在解析语句var foo = function foo() {};时,var foo声明很可能在执行 function foo(){}之后被赋值为

这意味着function foo将在全局作用域中定义,通常是window

之后,var foo被分配,从而将window.foo隐藏在foo的作用域中。因此,实际上,您的代码定义了window.foowindow.bar,如果您的当前作用域仍然存在,它们不会被垃圾收集。