2014-01-20 4 views
1

Мне недавно пришлось исправить ошибку, которая иногда проявлялась в Internet Explorer. Ошибка заключалась в том, что иногда синтаксический анализатор подавлялся по коду вродеЯвляется <! - действительным javascript?

<script type="text/javascript"> 
<!-- // comments --> 
/*...*/ 
</script> 

Это мы исправили исправлением комментария. Мой вопрос: есть ли «<!--» действительный код javascript, или нет? Я попытался проверить его с помощью firebug, и он говорит только «Undefined». JSFiddle не волновала. IE только задыхался от него в некоторых случаях (перезагрузка рассматриваемой страницы будет отображаться в результате задействованного скрипта).

Зная, что по историческим причинам комментарий HTML внутри js может быть действительным в зависимости от его точной позиции, а фаза луны действительно полезна, меня больше интересуют ответы типа «var <!-- foo is valid js code , но <!-- сама по себе не является вот почему:. ...»

я сделал некоторый анализ в поджигатель:

var x = 2; 
var y = 3; 
var z = 0; 
console.log(x); 
console.log(y); 

y<!--x; 
console.log(x); 
console.log(y); 

z = y<! --x; 
console.log(x); 
console.log(y); 
console.log(z); 

в результате следующих действий:

2 
3 
2 
3 
1 
3 
false 

Интересна разница между первой и второй попытками.

Затем я попытался

z = (y <!--x); 
console.log(z); 

Что не удалось с

SyntaxError: missing) in parenthetical 
+0

'foo

+0

Это может быть связано с дополнительным пространством перед комментарием HTML, если это не опечатка. Некоторые парсители Javascript могут игнорировать комментарии HTML * прямо в начале * скрипта. –

+1

@cookiemonster 'ReferenceError: foo не определен' – Izkata

ответ

1

Это не так.

Если вы идете в the standard, вы увидите, что < может существовать только в ВыраженияОтношении, который <!-- не как это что-либо на левой стороне нет.

9

Прежде, чтобы ответить на ваш вопрос о Is <!-- valid JavaScript: Нет, это не так, ни в одной из форм, которые вы дали в вашем вопросе. Это связано с тем, что это неверно в соответствии с грамматикой JavaScript BNF, которую вы можете найти здесь: http://tomcopeland.blogs.com/EcmaScript.html

Если вам интересно, вот почему вы видите его внутри блоков сценариев: это символ комментария HTML. Вы видите его очень часто в тегах сценария, как это:

<script> 
<!-- 

.. JavaScript code... 

// --> 
</script> 

Причина заключается в том, что старые браузеры (и с «старой» Я имею в виду «каменный век», как Netscape 1.0), что даже не поддерживает JavaScript, и в ином случае просто покажите код на экране. Таким образом, эти старые браузеры рассматривают JavaScript как HTML-комментарии и не отображают его. Новые браузеры игнорируют это и просто запускают JavaScript.

Вот как это работает (от http://www.w3.org/TR/html401/interact/scripts.html#h-18.3.2): механизм JavaScript разрешает строку <!-- происходить в начале элемента SCRIPT и игнорирует дальнейшие символы до конца строки. JavaScript интерпретирует // как начало комментария, проходящего до конца текущей строки. Это необходимо для скрытия строки --> от парсера JavaScript.

Поскольку все браузеры в настоящее время поддерживают JavaScript (даже если он отключен), вам больше не нужно это делать.Это на самом деле плохая практика, чтобы сделать это из-за этих причин (от http://www.javascripttoolbox.com/bestpractices/#comments):

  • В XHTML документов, источник фактически будет скрыт от всех браузеров и бесполезен
  • -- не допускается в комментариях HTML, поэтому любые операции декремента в сценарии являются недействительными

еще глубже объяснение и все минусы и профи можно найти здесь: http://lachy.id.au/log/2005/05/script-comments

+0

Я знаю, что это стартер HTML-комментариев, да. Тем не менее, <,!, - являются действительными js-операторами. Я хочу знать, возможно ли, что комбинация несколько верна, или точно почему нет, в Javascript. –

+3

@AdrianoVaroliPiazza: Недействительно, потому что не существует операнда перед '<'. 'var x = 10; 5

+1

Две вещи: это новый код, и времена, когда я видел похожий код, были с комментарием HTML, которым предшествует //, я думаю. –

0

Комментарии в J avascript похожи на другие языки C-типа (// для одиночной строки,/* */для блоков.

+0

-1 Это действительно не отвечает на мой вопрос –

+0

Позвольте мне повторить попытку, но на это ясно ответил этот вопрос. Выражение явно недействительно javascript, но сегодня оно игнорируется многими интерпретаторами из-за его предыдущего (взломанного) использования, как описано выше. <- числовой оператор сравнения! является оператором 'not', и - является арифметическим оператором. Если бы я теоретизировал, если этот хак никогда не использовался и, таким образом, игнорировался парсерами сегодня, просто запись

5

В старых браузерах потребовалось включить эти комментарии, поскольку браузеры не могли правильно разобрать javascript. он попытался бы буквально проанализировать javascript как html, который вызвал ошибки выполнения сценария.

Сегодня браузеру это не нужно.

Смежные вопросы