
Are semicolons needed after an object literal assignment in JavaScript?以下代码说明了分配的对象文字,但之后没有分号:
这似乎是合法的,并且不会发出警告(至少在Firefox3中)。 这是完全合法的,还是在不允许使用JavaScript的严格版本中? 我特别想知道将来的兼容性问题...我想编写"正确的" JavaScript,所以从技术上讲,如果我需要使用分号,则希望使用它。 从技术上讲,JavaScript在许多情况下都具有分号作为可选项。 但是,作为一般规则,请在任何语句的末尾使用它们。为什么?因为如果您想压缩脚本,它将使您免于无数小时的沮丧。 自动分号插入由解释器执行,因此您可以根据需要将其省略。在评论中,有人声称
但这是不正确的。它们是可选的;实际情况是,行终止符会影响分号的自动插入;这是一个微妙的区别。 这是分号插入的其余标准:
由于它们基于完整的JavaScript解析器,因此在不使用分号的情况下,YUI Compressor和dojo收缩安全功能应该可以很好地工作。但是Packer和JSMin不会。 始终在语句末尾使用分号的另一个原因是,有时您可能会意外地将两个语句组合在一起以创建非常不同的内容。例如,如果您使用通用技术遵循语句以使用闭包创建范围:
解析器可能将方括号解释为函数调用,从而导致类型错误,但在其他情况下,它可能导致难以跟踪的细微错误。另一个有趣的事故是,如果下一条语句以正则表达式开头,则解析器可能会认为第一个正斜杠是除号。 JavaScript解释器执行称为"分号插入"的操作,因此,如果没有分号的行有效,则分号将被安静地添加到语句的末尾,并且不会发生错误。
不太复杂,当某些事情显然不正确时,至少会引发错误。但是在某些情况下,由于分号的插入,不会引发错误,但是语句没有按预期执行。考虑一个应该返回一个对象的函数:
像这样的错误可能非常难以捉摸,尽管您不能确保这种情况永远不会发生(因为我无法关闭分号插入),但是当您通过以下方式使意图清晰时,这些类型的错误就更容易识别始终使用分号。明确地添加分号通常被认为是好的样式。 在阅读道格拉斯·克罗克福德(Douglas Crockford)精湛而简洁的书《 JavaScript:The Good Parts》时,我第一次意识到这种隐患的可能性。我强烈推荐它。 在这种情况下,语句末尾不需要分号。结论是相同的,但是推理还很遥远。
JavaScript没有将分号作为"可选"。相反,它对自动分号插入有严格的规定。分号对于 不需要分号。有些人选择遵循始终以分号终止的约定,而不是允许JavaScript在换行符处自动终止,但是我敢肯定,您会发现支持这两个方向的组。
如果您要编写"正确的" JavaScript,我建议在Firefox中将 使用JSLint保持JavaScript整洁 JSLint说:
这是无效的(请参阅下面的说明)JavaScript代码,因为赋值只是一个常规语句,与
由于JavaScript解释器会尝试添加分号来修复语法错误,因此可以省去分号,但这是一个额外且不必要的步骤。我不知道任何严格的模式,但是我知道自动解析器或压缩器/混淆器需要该分号。 如果要编写正确的JavaScript代码,请写分号:-) 根据ECMAscript规范http://www.ecma-international.org/publications/standards/Ecma-262.htm,如果缺少分号,则会自动插入。这使得脚本作者不需要它们,但是这意味着解释器需要它们。这意味着原始问题的答案是"否",编写脚本时不需要回答,但正如其他人所指出的,出于各种原因建议这样做。 |