Однострочные ‹!-- комментарии в JavaScript и ECMAScript

В прошлом веке был популярный «хак», чтобы скрыть JavaScript от браузеров, не поддерживающих JavaScript:

<script type = "text/javascript">
    <!--
    alert("Hello, World!");
    // --> Your browser doesn't support JavaScript
</script>

Несмотря на то, что <!-- в ряде руководств объясняется как однострочный комментарий JavaScript , это нигде не упоминается в стандарте ECMAScript (см. 7.4 Комментарии). Несмотря на то, что этот тип комментариев не является стандартным, он поддерживается всеми современными браузерами, поэтому с его помощью вы можете закомментировать любой код JavaScript:

<script type = "text/javascript">
    <!-- alert("Hello, World!");
    <!-- This is a comment
    <!-- This is another comment
    <!-- This is yet another comment
</script>

Тем не менее, есть одно исключение: функция eval(). Следующий код правильно работает в Communicator 4.x/Mozilla/Opera(Presto)/Safari/Chrome, но вызывает синтаксическую ошибку в MSIE:

<form action = "#">
    <script type = "text/javascript">
        function testEval() {
            var s = "<!--\n";
            s += "alert(\"eval() invoked\");\n";
            s += "// -->"
            eval(s);
        }
    </script>
    <input type = "button" value = "Test eval()" onclick = "testEval();"/>
</form>

По сути, в отличие от всех других браузеров, MSIE не работает на eval("<!--").

2 вопроса:


person Bass    schedule 06.05.2015    source источник
comment
Почему вы хотите закомментировать javascript в браузере, когда он не включен?   -  person nils    schedule 06.05.2015
comment
На этот раз IE прав. <!-- — синтаксическая ошибка. Но поскольку <script> — это элемент с узлом text, который содержит код, синтаксический анализатор HTML удаляет содержимое из DOM. (Если я ошибаюсь, пожалуйста, поправьте меня)   -  person Ismael Miguel    schedule 06.05.2015
comment
1-й вопрос действительно является дубликатом. Я по-прежнему был бы признателен за любые отзывы о проблеме с MSIE eval().   -  person Bass    schedule 06.05.2015
comment
@FelixKling Он не полностью дублирован. Вопрос также спрашивает, почему IE отличается.   -  person Ismael Miguel    schedule 06.05.2015
comment
@Ismael: Конечно, но я могу утверждать, что вопрос должен быть одним вопросом, а не двумя. Также другой ответ дает понять (надеюсь), что это устаревшая нестандартная функция браузера. Либо IE просто перестал его поддерживать, либо никогда не поддерживал.   -  person Felix Kling    schedule 06.05.2015
comment
@FelixKling Я думаю, что это была случайная особенность. Но, тем не менее, это вопрос о поведении с языковым конструктором, который не рассматривается в другом вопросе.   -  person Ismael Miguel    schedule 06.05.2015
comment
@Ismael: Тогда либо весь пост должен быть сокращен до этого вопроса, либо должен быть опубликован новый вопрос. Однако я сомневаюсь, что кто-то, кто не работает с IE, сможет ответить на этот вопрос.   -  person Felix Kling    schedule 06.05.2015
comment
@FelixKling Давайте посмотрим, что делает ОП. Сокращение вопроса было бы отличной идеей. Но на данный момент он, возможно, находится в «серой зоне»: он дублируется, а это не так.   -  person Ismael Miguel    schedule 06.05.2015
comment
@nils — так что, если браузер вообще не распознает элемент <script> (например, если это Netscape 1.0), он не будет рассматривать сценарий как текст, который будет отображаться пользователю. (Это бессмысленно в этом веке).   -  person Quentin    schedule 06.05.2015
comment
Я предполагаю, что IE обрабатывает только <!-- внутри <script> элементов особым образом, потому что это единственное место, где они могут иметь смысл. Они не имеют смысла в произвольном коде JS (например, в eval), и я предполагаю (хотя я не могу это проверить), что вы также получите синтаксическую ошибку, если включите код как скрипт src. Однако я не работаю над IE и не знаю никого, кто этим занимается, так что это всего лишь предположение.   -  person Felix Kling    schedule 06.05.2015
comment
@FelixKling Я не думаю, что это лечится по-другому. <script><!-- a --></script> и <div><!-- a --></div> будут проанализированы парсером HTML как <script></script> и <script></script>. Поскольку пустой <script> не является недопустимым HTML и не является недопустимым Javascript, все проходит нормально, без ошибок. При запуске eval('<!--'); движок Javascript ожидает чистый Javascript. Это моя дикая догадка. И предположим, что IE не отстой (намного).   -  person Ismael Miguel    schedule 06.05.2015
comment
@Ismael: Но дело в том, что <!-- внутри элемента <script> на самом деле интерпретируется движком JS, а не парсером HTML. Обратите внимание, что в примерах нет закрывающего -->. Другой вопрос объясняет, что <!-- обрабатываются как однострочные комментарии в JS.   -  person Felix Kling    schedule 06.05.2015
comment
@FelixKling Тогда я был действительно неправ. Я думаю, что у IE были некоторые проблемы с eval() в прошлом. Обратите внимание, что Function('<!--')() выдает синтаксическую ошибку в IE11 (как и в случае с eval()). Но поскольку это устарело, проблем нет. Думаю, браузеры не обязаны иметь устаревшую функциональность.   -  person Ismael Miguel    schedule 06.05.2015