为什么在注释中添加 </script > 会破坏解析器?

为什么在注释中添加 </script>会破坏解析器?这是一个错误,还是我忽略了文档中的某些内容?

我已经在 Chrome,Firefox,Opera,Internet Explorer 上测试过了,结果都是一样的。

单行评论:

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


Foo();

多行评论:

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


Foo();

3882 次浏览

这是因为 W3C 定义的 HTML 解析器与 JavaScript 解析器完全分离。在 <script>标记之后,它寻找结束的 </script>,而不管它在注释或字符串中,因为它将 JS 代码视为普通文本。

HTML 解析器不解析 JavaScript。它只解析由 <tag></tag>标记表示的 HTML 元素。它不知道某些东西是 JavaScript 注释。当它看到 </script>结束标记时,它假定 script 元素正在被关闭。无论字符串 </script>出现在什么上下文中,都会发生同样的情况; 例如,console.log("</script>")会产生相同的行为。

这是一个很好的理由,不要将脚本嵌入到 HTML 中,而是在外部包含它们。

可以使用 HTML 转义嵌入的 JavaScript 代码

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


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


Foo();


//-->
</script>

因此,HTML 解析器将整个 JavaScript 代码视为 HTML 注释,而 JavaScript 解释器将忽略 HTML 注释行。

一个更简单的解决办法是嵌入评论:

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


Foo();

它将注释 javascript AND for html 的行。