我在一段javascript中遇到以下错误(在Firefox 3.5中,运行Firebug)
cannot access optimized closure
我知道,从表面上看,导致错误的原因。我有一条线
options.length()
而不是
options.length
修复此错误,使消息消失。但我很好奇。这是什么意思?什么是优化的闭包?是否优化了javascript解释器自动执行的操作?它做了什么?
答案 0 :(得分:4)
当Firebug运行时,我也遇到了这个问题。
似乎有时候会出现异常(无论出于何种原因),并且在调用堆栈中的某处有一个递归函数调用。异常会因为神秘的“InternalError:无法访问优化闭包”而重新提升
改变我定义递归函数的方式似乎使这个问题消失了。例如改变
function foo(bar) {... foo(recursively); ...}
到
var foo = function(bar) {... foo(recursively); ...}
希望有所帮助。
答案 1 :(得分:3)
这是Firebug开放时Firefox的一个错误:
https://bugzilla.mozilla.org/show_bug.cgi?id=505001
[之前的回答提到这是由于this other bug,我认为这是不正确的,因为其他问题与Firebug无关。]
答案 2 :(得分:1)
好像是一个Firefox错误: https://bugzilla.mozilla.org/show_bug.cgi?id=496790
答案 3 :(得分:1)
闭包是具有上下文的函数。如果动态创建一个新函数,则创建一个闭包。
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
这里,闭包是makeAdder返回的内部函数,以及传递的'5'。
javascript引擎可能会选择优化上面显示的功能,使事情运行得更快,从不生成或运行该代码,因此无法调试或引用它。优化器应该非常小心,以确保没有影响,所以我猜这个错误。
答案 4 :(得分:1)
答案 5 :(得分:1)
这也可能是由简单的竞争条件引起的。我只是在文档准备好之前重构一个“启动”对象,它做了一些事情。一旦我尝试访问在启动对象下面定义的第二个对象,我就收到此错误。
我的印象是脚本执行一直等到所有代码都被编译完毕。显然情况并非如此。等待文件准备调用第二个对象上的方法修复了问题。此外,使用这个漂亮的'dump()'函数确认在发生错误时仅部分定义了第二个对象:http://www.openjs.com/scripts/others/dump_function_php_print_r.php
答案 6 :(得分:0)
我今天遇到了同样的错误。在我的情况下,这是因为我引用了一个不存在或不可用的对象的属性或函数。我猜测,由于该对象是通过优化的闭包可用的,因此firebug无法访问该对象的元数据,从而无法获取神秘的错误消息。
答案 7 :(得分:0)
今天也发生在我身上。 Firebug在此函数的第2行出错:
function IsValidDate(objName) { re = new RegExp('^( +|today|pdate|- *\\d+ *(day(s|)|week(s|))+ *$', 'i'); if (re.test(objName.value)) return 2; return (chkdate(objName)); }
当我在第1行声明“re”之前添加“var”时,错误就消失了。
答案 8 :(得分:0)
在具有此错误的函数中,代码中的其他位置会引发异常。尝试访问不存在的变量可能很简单。
我认为我们需要在这里获取一个Firebug开发人员来回答为什么它没有给出一个更具体的错误,即关闭中引发异常以提示错误的位置。
您粘贴了options.length(),但它不是提示错误的原因。导致错误的原因是您的错误在封闭内部。
function(){
array.length()
}
给出错误