以下代码说明了一个对象字面量被赋值,但之后没有分号:
var literal = {
say: function(msg) { alert(msg); }
}
literal.say("hello world!");
这似乎是合法的,并且不会发出警告(至少在 Firefox 3 中)。这是完全合法的,还是有一个严格的 JavaScript 版本不允许这样做?
我特别想知道未来的兼容性问题......我想编写“正确的”JavaScript,所以如果技术上我需要使用分号,我想使用它。
从技术上讲,JavaScript 在许多情况下都将分号作为可选的。
但是,作为一般规则,在任何语句的末尾使用它们。为什么?因为如果你想压缩脚本,它会让你从无数小时的挫折中解脱出来。
自动分号插入由解释器执行,因此您可以根据需要将它们省略。在评论中,有人声称
对于 break/continue/throw 等语句,分号不是可选的
但这是不正确的。它们是可选的;真正发生的是行终止符影响自动分号插入;这是一个细微的差别。
以下是分号插入标准的其余部分:
然而,为方便起见,在某些情况下,源文本中可能会省略此类分号。这些情况通过在这些情况下自动将分号插入到源代码标记流中来描述。
YUI Compressor 和 dojo shrinksafe 应该在没有分号的情况下工作得很好,因为它们基于完整的 JavaScript 解析器。但是 Packer 和 JSMin 不会。
始终在语句末尾使用分号的另一个原因是,有时您可能会不小心将两个语句组合起来,从而产生截然不同的内容。例如,如果您遵循使用闭包创建作用域的常用技术的语句:
var literal = {
say: function(msg) { alert(msg); }
}
(function() {
// ....
})();
解析器可能会将方括号解释为函数调用,这会导致类型错误,但在其他情况下,它可能会导致难以追踪的细微错误。另一个有趣的错误是,如果下一条语句以正则表达式开头,解析器可能会认为第一个正斜杠是除号。
JavaScript 解释器会做一些叫做“分号插入”的事情,所以如果没有分号的行是有效的,分号会悄悄地添加到语句的末尾,并且不会发生错误。
var foo = 'bar'
// Valid, foo now contains 'bar'
var bas =
{ prop: 'yay!' }
// Valid, bas now contains object with property 'prop' containing 'yay!'
var zeb =
switch (zeb) {
...
// Invalid, because the lines following 'var zeb =' aren't an assignable value
不太复杂,至少当某些事情明显不正确时会抛出错误。但也有一些情况并没有抛出错误,而是由于插入分号而导致语句没有按预期执行。考虑一个应该返回对象的函数:
return {
prop: 'yay!'
}
// The object literal gets returned as expected and all is well
return
{
prop: 'nay!'
}
// Oops! return by itself is a perfectly valid statement, so a semicolon
// is inserted and undefined is unexpectedly returned, rather than the object
// literal. Note that no error occurred.
像这样的错误可能非常难以追捕,虽然你不能确保这永远不会发生(因为我不知道如何关闭分号插入),当你通过以下方式明确你的意图时,这些类型的错误更容易识别始终使用分号。那和显式添加分号通常被认为是好的风格。
在阅读道格拉斯·克罗克福德 (Douglas Crockford)精湛而简洁的著作“ JavaScript: The Good Parts ”时,我第一次意识到这种潜在的可能性很小。我强烈推荐它。
在这种情况下,语句末尾不需要分号。结论是一样的,但推理有偏差。
JavaScript 没有分号作为“可选”。相反,它对自动分号插入有严格的规定。break对于, continue, or 之类的语句,分号不是可选的throw。有关详细信息,请参阅ECMA 语言规范;具体11.9.1,分号自动插入规则。
使用JSLint让你的 JavaScript 保持干净整洁
JSLint 说:
错误:
隐含全局:警报 2
第 3 行字符 2 的问题:缺少分号。
}
分号不是必需的。有些人选择遵循始终以分号结束的惯例,而不是让 JavaScript 在换行处自动这样做,但我相信您会发现提倡任一方向的团体。
javascript.options.strict如果您正在考虑编写“正确的”JavaScript,我建议您在 Firefox 中将(accessed via about:config) 设置为 true 进行测试。它可能无法捕获所有内容,但它应该可以帮助您确保 JavaScript 代码更加合规。
这是无效的(请参阅下面的说明)JavaScript 代码,因为赋值只是一个常规语句,与
var foo = "bar";
分号可以省略,因为 JavaScript 解释器会尝试添加分号来修复语法错误,但这是一个额外且不必要的步骤。我不知道有什么严格模式,但我知道自动解析器或压缩器/混淆器需要那个分号。
如果您想编写正确的 JavaScript 代码,请写下分号 :-)
根据 ECMAscript 规范http://www.ecma-international.org/publications/standards/Ecma-262.htm,如果分号缺失,系统会自动插入分号。这使得脚本作者不需要它们,但它意味着解释器需要它们。这意味着原始问题的答案是“否”,编写脚本时不需要它们,但正如其他人所指出的那样,出于各种原因建议使用它们。
分号是可选的,但如果您通过 YUI Compressor 等 JavaScript 最小化程序运行它,您的代码将变得无效。因此,始终包含分号是一个好习惯。
我很确定这会在 IE 上崩溃。虽然它可能是有效的 javascript,但无论如何您可能必须添加分号