Javascript+;萤火虫:“;无法访问优化的闭包“;这是什么意思?

Javascript+;萤火虫:“;无法访问优化的闭包“;这是什么意思?,javascript,optimization,firebug,closures,Javascript,Optimization,Firebug,Closures,我刚刚在一段javascript中发现了以下错误(在Firefox3.5中,Firebug正在运行) 从表面上看,我知道是什么导致了这个错误。我有一句台词 options.length() 而不是 options.length 修复此错误,使消息消失。但我很好奇。这是什么意思?什么是优化闭包?优化外壳是否是javascript解释程序自动完成的?它是做什么的?看起来像是一个Firefox bug: 闭包是一个带有上下文的函数。如果动态创建新函数,则创建闭包 function makeAdd

我刚刚在一段javascript中发现了以下错误(在Firefox3.5中,Firebug正在运行)

从表面上看,我知道是什么导致了这个错误。我有一句台词

options.length() 
而不是

options.length
修复此错误,使消息消失。但我很好奇。这是什么意思?什么是优化闭包?优化外壳是否是javascript解释程序自动完成的?它是做什么的?

看起来像是一个Firefox bug:
闭包是一个带有上下文的函数。如果动态创建新函数,则创建闭包

function makeAdder(int num) {
    return function(int num2) { return num + num2; }
}

adder = makeAdder(5);
adder(7) // returns (5+7) = 12
adder(2) // returns (5+2) = 7
function(){
    array.length()
}
这里,闭包是makeAdder返回的内部函数,以及传递的“5”


javascript引擎可能会选择优化上面显示的函数,以使运行速度更快,从不生成或运行该代码,因此无法调试或引用它。优化器应该非常小心以确保没有影响,所以我猜这是一个错误。

当Firebug运行时,我也遇到了这个问题

这似乎有时会发生,当引发异常时(无论出于何种原因),当调用堆栈中的某个地方有递归函数调用时。异常被重新引发为神秘的“InternalError:无法访问优化的闭包”

改变我定义递归函数的方式,似乎可以解决这个问题。例如从

function foo(bar) {... foo(recursively); ...}


希望能有所帮助。

我今天遇到了同样的错误。在我的例子中,发生这种情况是因为我引用的对象的属性或函数不存在或不可用。我猜,由于该对象通过优化的闭包可用,firebug无法访问该对象上的元数据,因此无法访问隐藏的错误消息。

Firefox中的一个错误发生在firebug打开时:


[先前的回答提到这是由于,我认为这是不正确的,因为其他问题与Firebug无关。]

今天我也遇到了这种情况。此函数第2行出现Firebug错误:

function IsValidDate(objName) { re = new RegExp('^( +|today|pdate|- *\\d+ *(day(s|)|week(s|))+ *$', 'i'); if (re.test(objName.value)) return 2; return (chkdate(objName)); } 函数IsValidDate(对象名){ re=新的RegExp(“^(+124;今天|更新|-*\\d++*(天(s |)、周(s |))+*$,“i”); if(重新测试(objName.value))返回2; 返回(chkdate(objName)); }
当我在第1行的“re”声明之前添加“var”时,错误消失了。

在发生此错误的函数中,代码的其他地方出现了异常。尝试访问不存在的变量可能很简单

我认为我们需要在这里找到一个Firebug开发人员来回答为什么它没有给出一个更具体的错误,关于引发异常以提示错误的闭包的位置

您粘贴了options.length(),但这并不是导致错误的原因。导致错误的原因是您的错误在闭包中

function makeAdder(int num) {
    return function(int num2) { return num + num2; }
}

adder = makeAdder(5);
adder(7) // returns (5+7) = 12
adder(2) // returns (5+2) = 7
function(){
    array.length()
}

这就产生了错误

这也可能是由一个简单的竞争条件引起的。我刚刚重构了一个“startup”对象,该对象在文档准备就绪之前做了一些事情。当我试图访问startup对象正下方定义的第二个对象时,我收到了此错误


我的印象是,脚本执行要等到所有代码都编译完成。显然不是这样。等待document ready调用第二个对象上的方法解决了这个问题。另外,使用这个漂亮的“dump()'函数确认第二个对象仅在发生错误时部分定义:

五天前(07/15)关于
mozilla.dev.platform
的相关讨论:-不幸的是,它没有提供太多的答案,我只是在交叉链接我在Firefox中收到了这条消息,但Chrome在代码中的同一点上停止了。这个错误只影响FX3.0和3.5之间的夜间活动,所以这里的人很难看到它。你可能是指-
返回函数(){…}
,而不是
返回新函数(){…}
(因为后者实际上将使用函数作为构造函数实例化一个新对象)。此外,不需要“动态”创建函数来创建闭包;任何函数表达式或函数声明都会关闭其作用域链中的自由变量(通过
函数
创建的函数除外,这些函数设置为在其作用域链中仅包含全局作用域)。我在递归函数中遇到了这个问题,这为我解决了这个问题!谢谢!干杯。事实证明,不管函数是否被递归调用都没有什么区别,它只是以嵌套在另一个函数中的方式声明了这个问题。这也为我解决了这个问题。它不是递归函数关于这个bug的评论似乎表明这在Firefox 3.6中已经修复。耶!如果有人在3.6中看到这个,请在firebug新闻组中提出。