Причина ошибки синтаксического анализа JavaScript в MSIE 8 - PullRequest
9 голосов
/ 22 июня 2010

Учитывая что-то вроде

var obj = {
     foo: function(){
         try{
             doSomething();
          }catch(ex){
               //@TODO - report error
          }
     }
 }

MSIE 8 выдает «Отсутствующая точка с запятой в строке #», где находится @TODO.

После того, как я собралДесятки @ TODO должны быть! TODO, MSIE смогла правильно разобрать сценарий, и жизнь продолжалась.Я что-то здесь упускаю, MSIE использует какой-то нестандартный механизм, такой как // @ PRAGMA?

Поиск в Google для @TODO или // @ не принес ничего полезного.

Ответы [ 3 ]

9 голосов
/ 22 июня 2010

Это связано с условной компиляцией, изобретением, предназначенным только для IE, для варьирования компиляции JScript (в IE это название ECMAScript) на основе информации о браузере и среде. Синтаксис включает символ @, за которым следует строка для создания переменной, директивы или оператора. В этом случае наличие @TODO непосредственно после начала комментария приводит к тому, что текст комментария интерпретируется как оператор условной компиляции, причем @TODO является переменной условной компиляции (со значением NaN: см. http://msdn.microsoft.com/en-us/library/k0h7dyd7%28v=VS.80%29.aspx).

Операторы условной компиляции обычно содержатся в комментариях JavaScript: они предназначены для того, чтобы другие браузеры не пытались интерпретировать код, но на самом деле не нужны для запуска условной компиляции. Документация MSDN находится здесь:

http://msdn.microsoft.com/en-us/library/ahx1z4fs%28v=VS.80%29.aspx

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

/*@cc_on @*/

Поэтому, если вы сможете найти эту строку и удалить ее, тогда ваш //@TODO - report error будет в порядке. Тем не менее, часть вашего кода может полагаться на условную компиляцию, так что это может быть не вариант. Обходной путь - вставить пробел между началом комментария (// или /*) и символом @:

// @TODO - report error

Документация Microsoft не достаточно ясна, чтобы понять, почему это работает, поскольку переменные условной компиляции также работают вне комментариев:

// The following works in IE:

/*@cc_on @*/
var j = @_jscript_build;
alert(j);

Поэтому самым безопасным вариантом было бы вообще не использовать @TODO.

2 голосов
/ 22 июня 2010

Синтаксис комментария + @ используется для условной компиляции в Internet Explorer.Смотри http://www.javascriptkit.com/javatutors/conditionalcompile.shtml

0 голосов
/ 22 июня 2010

Я вспомнил, что видел подобное на наших форумах, похоже, что оно интерпретируется JScript:

http://www.sencha.com/forum/showthread.php?92186-FIXED-579-Comment-line-leads-to-IE7-error&highlight=comment

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...