Javascript + Firebug: «не может получить доступ к оптимизированному закрытию» Что это значит? - PullRequest
22 голосов
/ 20 июля 2009

Я только что получил следующую ошибку в фрагменте javascript (в Firefox 3.5, с запущенным Firebug)

cannot access optimized closure

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

options.length() 

вместо

options.length

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

Ответы [ 9 ]

4 голосов
/ 26 августа 2009

У меня тоже была эта проблема при запуске Firebug.

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

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

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

до

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

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

3 голосов
/ 15 октября 2009

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

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

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

1 голос
/ 14 сентября 2010

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

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

1 голос
/ 21 августа 2009

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

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 голос
/ 20 июля 2009

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

0 голосов
/ 25 апреля 2010

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

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

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

function(){
    array.length()
}

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

0 голосов
/ 03 декабря 2009

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

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

...