Javascript + Firebug:“无法访问优化的闭包”是什么意思?

时间:2009-07-20 15:41:43

标签: javascript optimization firebug closures

我在一段javascript中遇到以下错误(在Firefox 3.5中,运行Firebug)

cannot access optimized closure

我知道,从表面上看,导致错误的原因。我有一条线

options.length() 

而不是

options.length

修复此错误,使消息消失。但我很好奇。这是什么意思?什么是优化的闭包?是否优化了javascript解释器自动执行的操作?它做了什么?

9 个答案:

答案 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()
}

给出错误