Книга Дракона является слишком сложной. Поэтому проигнорируйте его как начальную точку. Это хорошо и заставляет Вас думать много, как только у Вас уже есть начальная точка, но для начинающих, возможно, необходимо просто попытаться записать средство анализа математики/логического выражения с помощью RD, LL или методов LR-анализа со всем (lexing/parsing), записанный вручную в, возможно, C/Java. Это интересно сам по себе и дает Вам общее представление о проблемах, вовлеченных в компилятор. Тогда можно вскочить к собственному DSL, использующему некоторый язык сценариев (так как обработка текста обычно легче в них), и как кто-то сказал, генерируйте код или в самом языке сценариев или в C. Необходимо, вероятно, использовать flex/bison/antlr и т.д., чтобы сделать lexing/parsing, если Вы собираетесь сделать это в c/java.
Похоже на ошибку Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=496790
Замыкание - это функция с контекстом. Если вы динамически создаете новую функцию, вы создаете закрытие.
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 может выбрать оптимизировать функцию, показанную выше, чтобы все работало быстрее, никогда не создавая и не выполняя этот код, чтобы его нельзя было отлаживать или ссылаться. Оптимизаторы должны быть очень осторожны, чтобы не допустить воздействия, поэтому я предполагаю, что этот допустил ошибку.
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.
Сегодня я обнаружил ту же ошибку. В моем случае это произошло, потому что я ссылался на атрибут или функцию объекта, которые не существовали или были недоступны. Я предполагаю, что, поскольку объект был доступен через оптимизированное закрытие, firebug не мог получить доступ к метаданным этого объекта и, следовательно, к загадочному сообщению об ошибке.
Это ошибка Firefox, возникающая при открытом Firebug:
https://bugzilla.mozilla.org/show_bug.cgi?id=505001
[В предыдущем ответе упоминалось, что это произошло из-за этой другой ошибки , что я считаю неправильным, поскольку эта другая проблема не была связана с Firebug.]
Это случилось и со мной сегодня. Ошибка 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, ошибка исчезла.
В другом месте вашего кода в функции, которая есть эта ошибка. Это может быть так же просто, как попытаться получить доступ к несуществующей переменной.
Я думаю, нам нужно привлечь сюда разработчика Firebug, чтобы он ответил, почему он не дает более конкретной ошибки относительно того, где именно в закрытии, которое вызвало исключение, чтобы вызвать ошибку.
Вы вставили options.length (), но ошибка возникла не из-за этого. Причина ошибки заключается в том, что ваша ошибка была внутри закрытия.
function(){
array.length()
}
, что дает ошибку