13

我知道这种形式:

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由定义创建的,而且它甚至不应该首先存在?

4

1 回答 1

1

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

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

之后,var foo被分配并因此隐藏window.foo在您的 name 范围内foo。因此,实际上,您的代码定义了window.fooor window.bar,如果您当前的范围离开,则不会被垃圾收集。

于 2013-05-31T18:55:43.553 回答