Почему добавление</script> в комментарий нарушает парсер?

Почему добавление </script> в комментарии разбивает парсер? Это ошибка или есть что-то в документации, которую я пропустил?

Я тестировал это в браузере Chrome, Firefox, Opera, Internet Explorer, и все они дают одинаковый результат.

Однострочный комментарий:

function Foo(){
  // </script>
  alert("bar");
};

Foo();

Ответ 1

Это происходит потому, что парсер HTML, определенный W3C, полностью отделен от парсера JavaScript. После тега <script> он ищет закрытие </script>, независимо от того, что он внутри комментариев или строк, потому что он рассматривает JS-код как обычный текст.

Ответ 2

Парсер HTML не анализирует JavaScript. Он анализирует только HTML-элементы, обозначенные тегами <tag> и </tag>. Он не знает, что что-то является комментарием к JavaScript. Когда он видит тег закрытия </script>, он предполагает, что элемент script закрывается. То же самое произошло бы в любом контексте, когда появилась строка </script>; например, console.log("</script>") приведет к такому же поведению.

Это довольно хорошая причина не встраивать скрипты внутри HTML, а скорее включать их извне.

Ответ 3

Вы можете использовать встроенный JavaScript-код с HTML-кодом

<script type="text/javascript">
<!--

function Foo(){
 // </script>
  alert("bar");
};

Foo();

//-->
</script>

Таким образом, весь код JavaScript рассматривается как комментарий HTML парсером HTML, а строки комментариев HTML игнорируются интерпретатором JavaScript.

Ответ 4

Простым обходным решением будет вложение комментариев:

function Foo(){
  //<!-- </script> -->
  alert("bar");
};

Foo();

Он будет комментировать строку для javascript И для html.