我最近不得不修复有时在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)
首先回答你的问题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):
-- 在HTML注释中不允许,因此脚本中的任何减量操作都是无效的可以在这里找到更深入的解释和所有缺点和专业知识:http://lachy.id.au/log/2005/05/script-comments