这个例子引自javascript.info代码机构一章,对分号的知识进行一个扩充。

  • 在大多数情况下,换行意味着一个分号。但是“大多数情况”并不意味着“总是”!

有很多换行并不是分号的例子,例如

alert(3 +
1
+ 2);

代码输出 6,因为 JavaScript 并没有在这里插入分号。显而易见的是,如果一行以加号 "+" 结尾,那么这是一个“不完整的表达式”,不需要分号。所以,这个例子得到了预期的结果。

但存在 JavaScript 无法确定是否真的需要自动插入分号的情况。

运行这段代码, 其结果会弹出显示1 然后2

[1, 2].forEach(alert)

现在我们在代码前面插入一个 alert 语句,并且不加分号

alert("There will be an error")

[1, 2].forEach(alert)

现在,如果我们运行代码,只有第一个 alert 语句的内容被显示了出来,随后我们收到了一个错误!

但是,如果我们在第一个 alert 语句末尾加上一个分号,就工作正常了;

alert("All fine now");

[1, 2].forEach(alert)

无分号的变体(variant)会出现报错,是因为 JavaScript 并不会在方括号 [...] 前添加一个隐式的分号。

所以,因为没有自动插入分号,第一个例子中的代码被视为了一条简单的语句,我们从引擎看到的是这样的:

alert("There will be an error")[1, 2].forEach(alert)

但它应该是两条语句,而不是一条。这种情况下的合并是不对的,所以才会造成错误。

最后修改:2020 年 11 月 24 日 02 : 17 PM
生活需要一些仪式感,比如手冲一杯咖啡:)