是<! - 有效的JavaScript?

Adr*_*zza 1 javascript

我最近不得不修复有时在Internet Explorer中出现的错误.错误是,有时候,解析器会像代码一样窒息

<script type="text/javascript">
 <!-- // comments -->
/*...*/
</script>
Run Code Online (Sandbox Code Playgroud)

我们通过更正评论来修复.我的问题是:是" <!--"有效的JavaScript代码,还是没有?我尝试用firebug测试它,它只说"Undefined".JSFiddle没有动摇.IE有时只会在它上面窒息(重新加载有问题的页面会显示所涉及的脚本的结果).

虽然知道,由于历史原因,js中的HTML注释可能是有效的,具体取决于它的确切位置和月相确实有用,我更感兴趣的答案,如"var <!--foo是有效的js代码,但<!--它自己不是.原因如下:......"

我在萤火虫中做了一些分析:

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);
Run Code Online (Sandbox Code Playgroud)

导致以下结果:

2
3
2
3
1
3
false
Run Code Online (Sandbox Code Playgroud)

第一次尝试和第二次尝试之间的区别很有趣.

然后我试过了

z = (y <!--x);
console.log(z);
Run Code Online (Sandbox Code Playgroud)

哪个失败了

SyntaxError: missing ) in parenthetical
Run Code Online (Sandbox Code Playgroud)

Koe*_*ers 9

首先回答你的问题Is <!-- valid JavaScript:不,它不是,你在问题中没有给出任何形式.这是因为它根据您在此处可以找到的JavaScript BNF语法无效:http://tomcopeland.blogs.com/EcmaScript.html

如果您有兴趣,这就是您在脚本块中看到它的原因:它是HTML注释字符.您确实经常在脚本标记中看到它,如下所示:

<script>
<!-- 

.. JavaScript code...

// -->
</script> 
Run Code Online (Sandbox Code Playgroud)

原因是旧浏览器(以及"旧"我的意思是"石器时代",如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

  • @AdrianoVaroliPiazza:它无效,因为```之前没有操作数.`var x = 10; 5 <!( - x)`虽然有效.这还取决于具体情况.在脚本标记内,`<! - `序列总是表示HTML注释,你会得到语法错误.如果代码在它自己的文件中,则不一定是这种情况. (3认同)

dda*_*son 5

在旧版浏览器中,需要插入这些注释,因为浏览器无法正确解析javascript.它会尝试将javascript解析为导致脚本执行失败的html.

今天,浏览器不需要这个.