Подтвердить что ты не робот

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

У меня появилась следующая ошибка в части javascript (в Firefox 3.5 с запуском Firebug)

cannot access optimized closure

Я знаю, поверхностно, что вызвало ошибку. У меня была строка

options.length() 

вместо

options.length

Устранив эту ошибку, сообщение исчезло. Но мне любопытно. Что это значит? Что такое оптимизированное закрытие? Оптимизирует ли оболочка что-то, что делает интерпретатор javascript автоматически? Что он делает?

4b9b3361

Ответ 1

У меня тоже была проблема, когда Firebug запущен.

Кажется, случается иногда, когда возникает исключение (по какой-либо причине) и когда есть вызов рекурсивной функции где-то в стеке вызовов. Исключение получает ре-рейз в качестве таинственного "InternalError: невозможно получить доступ к оптимизированному закрытию"

Изменение способа определения рекурсивной функции, похоже, устраняет эту проблему. например, изменение с

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

к

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

Надеюсь, что это поможет.

Ответ 4

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

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

Ответ 6

Это также может быть вызвано простым состоянием гонки. Я просто реорганизовал объект "запуска", который делает несколько вещей, прежде чем документ будет готов. Как только я попытался получить доступ к второму объекту, определенному непосредственно под объектом запуска, я получил эту ошибку.

У меня сложилось впечатление, что выполнение script ожидало, пока весь код не будет скомпилирован. Ясно, что это не так. Ожидание документа, готового вызвать методы на втором объекте, устранило проблему. Кроме того, использование этой прекрасной функции dump() подтверждает, что второй объект определяется только частично при возникновении ошибки: http://www.openjs.com/scripts/others/dump_function_php_print_r.php

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Вы вставили options.length(), но это не то, что вызвало ошибку. Что вызвало ошибку, так это то, что ваша ошибка была в закрытии.

function(){
    array.length()
}

который дает ошибку