【发布时间】:2013-05-30 11:09:08
【问题描述】:
我知道这个表格:
var foo = function bar() {};
会将bar 名称泄漏到封闭范围,并在jscript 中创建两个函数。
怎么样:
var foo = function foo() {};
?
它仍然将名称泄漏到封闭范围,但无论如何它都在那里(感谢var foo)。
我知道它将在整个范围内定义,但它会创建两个函数并立即取消引用/销毁其中一个,还是这仍然会导致泄漏?
在这种情况下:
var bar = function() {
foo();
var foo = function foo() {};
}
bar() 内部会不会有两个函数对象?
编辑
好吧,它肯定会创建两个函数对象,现在的问题是:由命名定义创建的函数是否在 var foo 行之后被 GC 取消引用和清理,所以不超过一个“活”@987654330 @instance 在上面的代码中的任何时候?
或者 IE 是 IE 会让它永远悬而未决,因为没有办法“取消引用”由定义创建的 foo,它甚至不应该放在首位?
【问题讨论】:
-
"in IE"...仅供参考,自 IE9 以来已修复...
-
@Christoph 改变了问题,谢谢
-
@user1737909 那篇文章没有具体说明函数和变量名称相同的
var foo = function foo() {};。特别是,文章提到手动取消引用名称。我想知道在我的情况下是否一切都得到了很好的清理。 -
理论上,这将创建一个被提升的函数声明,然后一旦到达代码中的该行,就会用函数表达式覆盖函数定义,从而允许对原始函数进行垃圾收集。奇怪的是,如果这样做了,当在函数上调用
toString()时,它会显示函数的名称,即使函数名称范围的奇怪泄漏也是如此。
标签: javascript internet-explorer jscript