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

sou*_*eck 13 javascript internet-explorer jscript

我知道这种形式:

var foo = function bar() {};
Run Code Online (Sandbox Code Playgroud)

bar名称泄漏到封闭范围并创建两个函数jscript.

怎么样:

var foo = function foo() {};
Run Code Online (Sandbox Code Playgroud)

它仍然将名称泄漏到封闭范围,但无论如何它都在那里(thx to var foo).

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

在这种情况下:

var bar = function() {
    foo();
    var foo = function foo() {};
}
Run Code Online (Sandbox Code Playgroud)

我们里面会有两个函数对象bar()吗?

编辑

好吧,它肯定会创建两个函数对象,现在的问题是:命名定义创建的函数是否var foo在行之后被GC解除引用并清除,因此foo在上面的代码中,任何时刻都只有一个"实时" 实例?

或IE将IE永远悬空,因为没有办法"解除引用" foo定义创建的内容,它甚至不应该首先出现在那里?

dro*_*nus 1

解析语句时var foo = function foo() {};var foo声明很可能是在执行后赋值的。 function foo(){}

这意味着function foo将在全局范围内定义,这是通常的window,首先。

之后,被分配并因此从您的名称范围中var foo隐藏。因此,事实上,您的代码定义了or ,如果您当前的作用域被保留,则它不会被垃圾回收。window.foofoowindow.foowindow.bar