为什么添加注释会破坏解析器?

时间:2015-09-30 07:25:02

标签: javascript html

为什么在评论中添加</script>会破坏解析器?这是一个错误还是我忽略的文档中有什么东西?

我在Chrome,Firefox,Opera,Internet Explorer中测试了它们,它们都产生了相同的结果。

单行注释:

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

Foo();

多行评论

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

Foo();

4 个答案:

答案 0 :(得分:101)

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

答案 1 :(得分:33)

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

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

答案 2 :(得分:9)

您可以HTML转义嵌入式JavaScript代码

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

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

Foo();

//-->
</script>

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

答案 3 :(得分:0)

更简单的解决方法是嵌入注释:

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

Foo();

它将评论javascript和html的行。