Javascript 正在使用var foo=函数foo(){};表达式在IE中创建内存泄漏<;9?
我知道这个表格:Javascript 正在使用var foo=函数foo(){};表达式在IE中创建内存泄漏<;9?,javascript,internet-explorer,jscript,Javascript,Internet Explorer,Jscript,我知道这个表格: var foo = function bar() {}; 将把条名称泄漏到封闭范围,并在jscript中创建两个函数 那么: var foo = function foo() {}; ? 它仍然将名称泄漏到封闭范围中,但无论如何它都在其中(thx到var foo) 我知道它将在整个范围内定义,但它是否会创建两个函数并立即取消引用/销毁其中一个函数,或者这仍然会导致泄漏 在这种情况下: var bar = function() { foo(); var foo
var foo = function bar() {};
将把条
名称泄漏到封闭范围,并在jscript
中创建两个函数
那么:
var foo = function foo() {};
?
它仍然将名称泄漏到封闭范围中,但无论如何它都在其中(thx到var foo
)
我知道它将在整个范围内定义,但它是否会创建两个函数并立即取消引用/销毁其中一个函数,或者这仍然会导致泄漏
在这种情况下:
var bar = function() {
foo();
var foo = function foo() {};
}
在bar()中是否有两个函数对象
编辑
好的,它肯定会创建两个函数对象,现在的问题是:由命名定义创建的函数是否会在var foo
行之后被GC取消引用和清理,因此在上面的代码中任何时候都不会有超过一个'live'foo
实例
或者IE会让它永远悬而未决,因为无法“取消引用”由定义创建的foo
,而且它本来就不应该在那里?解析语句var foo=function foo(){}
,在执行函数foo(){}
之后,最有可能分配变量foo
声明
这意味着函数foo
将首先在全局范围内定义,这通常是窗口
在此之后,var foo
将被分配,从而将window.foo
隐藏在名称foo
的范围之外。因此,实际上,您的代码定义了window.foo
或window.bar
,如果您当前的作用域被保留,则不会对其进行垃圾收集 “在IE中”。。。仅供参考,自从IE9以来,这个问题已经解决了…@Christoph改变了问题,thx@user1737909那篇文章没有特别提到var foo=function foo(){}代码>其中函数和变量的名称相同。特别是,本文提到手动取消对名称的引用。我想知道在我的例子中,是否所有的东西都得到了很好的清理。理论上,这将创建一个被提升的函数声明,然后一旦到达代码中的那一行,就会用函数表达式覆盖函数定义,从而允许对原始的函数进行垃圾收集。奇怪的是,如果这样做,当对函数调用toString()
时,它将显示函数名,即使函数名的作用域奇数泄漏也是如此。为什么要在全局作用域中定义函数?因为function foo(){}
的行为类似于foo=function(){}
的行为。和foo=something没有var
语句的code>实际上会分配window.foo
,而全局范围是window
,这是浏览器脚本的默认值。这意味着每个函数声明都是全局的,这是不正确的<代码>函数foo(){}
并不等同于foo=function(){}
。命名函数表达式对于a)调试和b)递归非常有用。该规范规定,此类函数的名称应仅在函数本身内部可见,即在封闭范围内不泄漏。但这是IE中的一个已知错误(我认为Chrome的JavaScript引擎对待这些问题没有区别。规范中定义,名称仅在函数内部可见,只有IE已知存在此问题。