JavaScript + Firebug: “не может получить доступ к оптимизированному закрытию” Что это означает?

Книга Дракона является слишком сложной. Поэтому проигнорируйте его как начальную точку. Это хорошо и заставляет Вас думать много, как только у Вас уже есть начальная точка, но для начинающих, возможно, необходимо просто попытаться записать средство анализа математики/логического выражения с помощью RD, LL или методов LR-анализа со всем (lexing/parsing), записанный вручную в, возможно, C/Java. Это интересно сам по себе и дает Вам общее представление о проблемах, вовлеченных в компилятор. Тогда можно вскочить к собственному DSL, использующему некоторый язык сценариев (так как обработка текста обычно легче в них), и как кто-то сказал, генерируйте код или в самом языке сценариев или в C. Необходимо, вероятно, использовать flex/bison/antlr и т.д., чтобы сделать lexing/parsing, если Вы собираетесь сделать это в c/java.

22
задан interstar 20 July 2009 в 15:41
поделиться

8 ответов

Похоже на ошибку Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=496790

1
ответ дан 29 November 2019 в 05:55
поделиться

Замыкание - это функция с контекстом. Если вы динамически создаете новую функцию, вы создаете закрытие.

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 может выбрать оптимизировать функцию, показанную выше, чтобы все работало быстрее, никогда не создавая и не выполняя этот код, чтобы его нельзя было отлаживать или ссылаться. Оптимизаторы должны быть очень осторожны, чтобы не допустить воздействия, поэтому я предполагаю, что этот допустил ошибку.

1
ответ дан 29 November 2019 в 05:55
поделиться

I had this issue too when Firebug is running.

It seems to happen sometimes, when an exception is raised (for whatever reason) and when there's a recursive function call somewhere in the call stack. The exception gets re-raised as the mysterious "InternalError: cannot access optimized closure"

Changing the way I define the recursive function, seems to make this issue go away. eg changing from

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

to

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

Hope that helps.

4
ответ дан 29 November 2019 в 05:55
поделиться

Сегодня я обнаружил ту же ошибку. В моем случае это произошло, потому что я ссылался на атрибут или функцию объекта, которые не существовали или были недоступны. Я предполагаю, что, поскольку объект был доступен через оптимизированное закрытие, firebug не мог получить доступ к метаданным этого объекта и, следовательно, к загадочному сообщению об ошибке.

0
ответ дан 29 November 2019 в 05:55
поделиться

Это ошибка Firefox, возникающая при открытом Firebug:

https://bugzilla.mozilla.org/show_bug.cgi?id=505001

[В предыдущем ответе упоминалось, что это произошло из-за этой другой ошибки , что я считаю неправильным, поскольку эта другая проблема не была связана с Firebug.]

3
ответ дан 29 November 2019 в 05:55
поделиться

Это случилось и со мной сегодня. Ошибка 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));
}

Когда я добавил «var» перед объявлением «re» в строке 1, ошибка исчезла.

0
ответ дан 29 November 2019 в 05:55
поделиться

В другом месте вашего кода в функции, которая есть эта ошибка. Это может быть так же просто, как попытаться получить доступ к несуществующей переменной.

Я думаю, нам нужно привлечь сюда разработчика Firebug, чтобы он ответил, почему он не дает более конкретной ошибки относительно того, где именно в закрытии, которое вызвало исключение, чтобы вызвать ошибку.

Вы вставили options.length (), но ошибка возникла не из-за этого. Причина ошибки заключается в том, что ваша ошибка была внутри закрытия.

function(){
    array.length()
}

, что дает ошибку

0
ответ дан 29 November 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: