3

为什么在 JavaScript 中你可以在没有 的情况下调用函数;

例子

假设 testMethod 在某处声明...

testMethod();

testMethod() // Without semicolon will still work.

还在元素示例中调用方法:

<input type="button" onclick="testMethod();" />
<input type="button" onclick="testMethod()" /> // Again no semicolon.
4

3 回答 3

32

这是一个称为“自动分号插入”(或 ASI)的功能。

来自处理 JavaScript 的自动分号插入

那么这些分号是如何为您插入的呢?通过遵循这些规则(从 ECMA-262 第 3 版,7.9.1 解释和简化):

  • 当解析程序时,遇到任何语法生成都不允许的标记(称为违规标记)时,如果以下一个或多个条件为真,则在违规标记之前自动插入分号:
    1. 违规标记与前一个标记至少由一个 LineTerminator 分隔。
    2. 有问题的令牌是 }。
  • 当遇到令牌输入流的末尾并且解析器无法将输入令牌流解析为单个完整程序时,会在输入流末尾自动插入分号。
  • 当语法的某些产生式允许令牌时,它是受限令牌,但产生式是受限产生式并且令牌将是紧接在注释“[no LineTerminator here]”之后的终端或非终端的第一个令牌。生产。

此外,如果受限令牌与前一个令牌至少有一个 LineTerminator 分隔,则在受限令牌之前自动插入一个分号。

...

于 2012-05-14T18:41:31.433 回答
2

因为如果 JavaScript 引擎认为分号应该在行尾,那么它会在行尾放置分号。这通常会引入错误而不是避免它们:

return
{
  user: 'foo'
}

上面的 return 语句返回......什么都没有:

return;
{
  user: 'foo'
}
于 2012-05-14T18:42:14.570 回答
2

JavaScript 解释器会为你添加分号。省略分号是一个非常糟糕的主意,因为它可能导致解释的 JavaScript 代码的行为与您预期的不同。

请参阅Wikipedia 上的重大示例:

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;

有关的:

您是否建议在 JavaScript 中的每条语句后使用分号?

于 2012-05-14T18:44:37.673 回答