Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在使用var foo=函数foo(){};表达式在IE中创建内存泄漏<;9?_Javascript_Internet Explorer_Jscript - Fatal编程技术网

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=somethingvar
语句的code>实际上会分配
window.foo
,而全局范围是
window
,这是浏览器脚本的默认值。这意味着每个函数声明都是全局的,这是不正确的<代码>函数foo(){}
并不等同于
foo=function(){}
。命名函数表达式对于a)调试和b)递归非常有用。该规范规定,此类函数的名称应仅在函数本身内部可见,即在封闭范围内不泄漏。但这是IE中的一个已知错误(我认为Chrome的JavaScript引擎对待这些问题没有区别。规范中定义,名称仅在函数内部可见,只有IE已知存在此问题。