【问题标题】:Is <!-- valid javascript?<!-- 是有效的javascript吗?
【发布时间】:2014-02-10 02:43:09
【问题描述】:

我最近不得不修复一个有时在 Internet Explorer 中出现的错误。错误在于,有时,解析器会卡在类似

之类的代码上
<script type="text/javascript">
 <!-- // comments -->
/*...*/
</script>

我们通过更正评论来解决这个问题。 我的问题是:“&lt;!--”是有效的javascript代码吗?我尝试用萤火虫测试它,它只说“未定义”。 JSFiddle 没有烦恼。 IE 有时只是卡住它(重新加载有问题的页面会显示所涉及脚本的结果)。

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

我在firebug中做了一些分析:

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);

结果如下:

2
3
2
3
1
3
false

第一次和第二次尝试的区别很有趣。

然后我尝试了

z = (y <!--x);
console.log(z);

失败了

SyntaxError: missing ) in parenthetical

【问题讨论】:

  • foo &lt;!--bar 有效。 :D
  • 如果不是拼写错误,可能是因为 HTML 注释前有多余的空格。一些 Javascript 解析器可能只在脚本的开头忽略 HTML cmets
  • @cookiemonster ReferenceError: foo is not defined
  • 当然。这并不意味着它不是有效的 JavaScript。这只是意味着你没有定义foo,也可能没有定义bar
  • @MackieeE,如前所述,我期待着将

标签: javascript


【解决方案1】:

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

如果您有兴趣,这就是您在脚本块中看到它的原因:它是 HTML 注释字符。你确实经常在这样的脚本标签中看到它:

<script>
<!-- 

.. JavaScript code...

// -->
</script> 

原因是旧浏览器(“旧”是指“石器时代”,如 Netscape 1.0)甚至不支持 JavaScript,否则只会在屏幕上显示代码。通过这样做,那些较旧的浏览器将 JavaScript 视为 HTML cmets 并且不显示它。较新的浏览器会忽略这一点,只运行 JavaScript。

这就是它的实际工作方式(来自http://www.w3.org/TR/html401/interact/scripts.html#h-18.3.2):JavaScript 引擎允许字符串&lt;!-- 出现在 SCRIPT 元素的开头,并忽略其他字符,直到行尾。 JavaScript 将// 解释为开始注释并延伸到当前行的末尾。这是从 JavaScript 解析器隐藏字符串 --&gt; 所必需的。

因为现在所有的浏览器都支持 JavaScript(即使它被关闭了),你不再需要这样做了。由于这些原因(来自http://www.javascripttoolbox.com/bestpractices/#comments),这样做实际上是不好的做法:

  • 在 XHTML 文档中,源代码实际上对所有浏览器都是隐藏的,并且变得无用
  • -- 不允许在 HTML cmets 中使用,因此脚本中的任何减量操作都是无效的

更深入的解释和所有的利弊都可以在这里找到:http://lachy.id.au/log/2005/05/script-comments

【讨论】:

  • 我知道它是一个 HTML 评论启动器,是的。尽管如此,
  • @AdrianoVaroliPiazza:这是无效的,因为&lt; 之前没有操作数。 var x = 10; 5&lt;!(--x) 将是有效的。这也取决于上下文。在脚本标签内,&lt;!-- 序列始终表示 HTML 注释,您会收到语法错误。如果代码在它自己的文件中,则不必如此。
  • 两件事:这是新代码,我认为类似的代码是在 HTML 注释前面加上 // 的时候。
  • @AdrianoVaroliPiazza:实际上,在 HTML 上下文(例如控制台)之外,5 &lt;!--x 也是有效的,但它返回 5x 仍然是 10 这以某种方式表明那里有什么奇怪的东西。无论如何,单独的&lt;!-- 是无效的,因为它错过了操作数。
  • @Adriano,实际上 JS 注释在 HTML 注释的结束标记之前:&lt;!-- ... //--&gt;。那是因为脚本解析器只忽略注释的开始标记,结束标记仍然必须是特殊的。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    不是。

    如果您转到the standard,您会看到&lt; 只能存在于RelationalExpression 中,而&lt;!-- 不存在,因为它的左侧没有任何内容。

    【讨论】:

      【解决方案4】:

      Javascript 中的注释与其他 C 类型语言一样(// 用于单行,/* */ 用于块。

      【讨论】:

      • 那让我再试一次,但显然到此为止。就表达式而言,它不是有效的 javascript,但由于它之前的(被黑)用法,今天很多解释器都忽略了它,如上所述。
      猜你喜欢
      • 2012-12-16
      • 2018-01-06
      • 2016-01-21
      • 2018-10-21
      • 2019-12-26
      • 1970-01-01
      • 2014-07-08
      相关资源
      最近更新 更多