问题标签 [automatic-semicolon-insertion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
255345 浏览

javascript - JavaScript 的自动分号插入 (ASI) 的规则是什么?

好吧,首先我可能应该问这是否取决于浏览器。

我已经读过,如果找到了一个无效的标记,但代码部分在该无效标记之前是有效的,如果它前面有一个换行符,则在该标记之前插入一个分号。

但是,由分号插入引起的错误引用的常见示例是:

..这似乎不遵循这个规则,因为 _a 将是一个有效的令牌。

另一方面,分解调用链按预期工作:

有没有人对规则有更深入的描述?

0 投票
3 回答
612 浏览

javascript - 我听说 Javascript 会插入“;” 自动,这可能会导致问题

我也听说 Go 也插入了它们,但他们采用了不同的方法

Javascript 在解释时如何插入分号?

0 投票
1 回答
422 浏览

javascript - 将分号置于 asi 模式中的括号前

我正在使用 JSHint 对我的 JavaScript 进行 linting,并启用了此选项

避免在我的代码中使用分号。

但是我必须用括号开始我的新行,所以我必须在那个开始之前放一个分号

JSHint 给我两个错误:

  • ';' 后缺少空格
  • 如果我在 ';' 后面加一个空格 我得到:预期 '(' 有不同的标识

我注意到这样 JSHint 很高兴

但我认为不是一个好的解决方案。

有没有办法在不关闭 JSHint 或white选项的情况下解决这个问题?

0 投票
1 回答
408 浏览

javascript - Resharper 可以在我的 javascript 函数声明中添加分号吗?

使用 Visual Studio 2012、Resharper 7.0.1

如果我正在编辑 JavaScript,并输入以下内容(| = 光标位置):

.. Resharper 将为我添加右括号:

...但我希望它之后也添加一个分号:

0 投票
3 回答
5086 浏览

javascript - 自动分号插入和返回语句

您可能知道,ECMAscript 试图变得聪明,如果您没有明确编写分号,它会自动插入分号。简单的例子

仍将按预期工作。但是,如果你依赖它,有一些警告。如果我们像这样重写那个函数

..那个函数现在会返回undefined,因为解释器会在语句之后插入分号return(这就是为什么你总是应该在语句的同一行加上大括号的原因)。

然而,知道了这一切,我现在想知道像下面这样的语句在浏览器和版本之间有多安全return

return statement我只是在生产环境中写了一个类似的。仅仅因为我知道 ECMAscript 对分号插入不太聪明的“问题”,我现在想知道该代码是否 100% 有效。在我对 FF/Chrome/IE(最新版本)的第一次测试中,这似乎完全没问题,但真的如此吗?

如果除了该行中的语句之外还有其他内容,自动分号插入是否会“唤醒” ?return任何人都可以提供有关此的实现级别的详细信息吗?

0 投票
1 回答
532 浏览

javascript - 在 JavaScript 中自动插入分号而不解析

我正在编写一个 JavaScript 预处理器,它会在必要的地方自动插入分号。不要问为什么。

现在我知道解决这个问题的一般方法是编写一个 JavaScript 解析器,并根据规范中的规则在必要时添加分号。但是我不想这样做,原因如下:

  1. 我不想写一个成熟的解析器。
  2. 我想保留评论和空白。

我已经(正确地)使用简单的扫描仪实现了自动分号插入的第二条和第三条规则。

然而,第一条规则被证明是实施起来更具挑战性。所以我有三个问题:

  1. 是否可以使用带有前瞻和后视的简单扫描仪来实现第一条规则?
  2. 如果可能,那么有人已经做到了吗?
  3. 如果不是那么我应该如何解决这个问题?

为了完整起见,这里是三个规则:

  • 当从左到右解析程序时,遇到任何语法生成都不允许的标记(称为违规标记)时,如果出现以下一项或多项,则在违规标记之前自动插入分号条件为真:

    1. 违规标记与前一个标记至少有一个LineTerminator分开。

    2. 有问题的令牌是}

  • 当程序从左到右解析时,遇到输入令牌流的结尾,并且解析器无法将输入令牌流解析为单个完整的 ECMAScript Program,则在末尾自动插入分号输入流。

  • 当程序从左到右解析时,遇到某个语法产生式允许的记号,但产生式是受限制的产生式,并且该记号将是紧跟注释之后的终端或非终端的第一个记号"[no LineTerminator here]" 在受限产生式中(因此这样的记号被称为受限记号),并且受限记号与前一个记号至少有一个LineTerminator分隔,然后在受限记号前自动插入分号.

但是,前面的规则还有一个额外的覆盖条件:如果分号随后将被解析为空语句,或者如果该分号将成为for语句标题中的两个分号之一(部分12.6.3 )。

0 投票
4 回答
4292 浏览

javascript - [] 之前没有分号导致 JavaScript 出错

当这段代码导致我今天非常惊讶

显然 JavaScript 的“自动分号插入”在这里没有按预期工作。但为什么?

我知道您可能会建议在;任何地方使用以避免类似的情况,但问题不在于是否更好使用;。我很想知道这里到底发生了什么?

0 投票
1 回答
84 浏览

javascript - JS中的自动分号插入会影响第一个{在新行上的for循环吗?

JS 自动分号插入是否会for(...)像我在以下示例中放置的那样在末尾放置一个分号,或者使用 for 循环将括号分成新行是否安全?

我发现很多信息说明了什么受到影响,但没有具体到我的问题,这让我相信它可能不会受到影响,但我想找到一个具体的答案。

就个人而言,我不喜欢用这样的括号换行,但问题已经提出;)

0 投票
2 回答
378 浏览

javascript - 括号会阻止分号插入吗?

假设我想设置一堆等于 null 的变量(并且不想使用数组/循环结构),或者我只想跨多行编写一个大型布尔表达式。在这种情况下,未闭合的括号会阻止分号插入吗?例如

或者

这与使用&&or ||or=对换行符分组表达式有何比较?即,这也总是有效吗?

我正在寻找所有浏览器(包括 IE6+)中最标准的方式。

0 投票
4 回答
253 浏览

javascript - 为什么有些编程语言允许自动包含分号?

如果忘记分号,C++ 等语言将无法使用,但 JavaScript 等其他语言会自动为您包含它们。

我从这篇文章中知道您是否建议在 JavaScript 中的每个语句后使用分号?,建议使用分号,并且在某些情况下会产生不必要的歧义(例如在不使用大括号时在 C++ 中悬挂 else)。

在某个时间点,必须做出让它们可选的决定(例如,当 JavaScript 的创建者有意识地选择使其可选时)。

我想知道为什么做出这个决定,以及它对这些语言的用户有什么好处。

背景:我是一名新手程序员,最近才开始学习 JavaScript。

编辑:对于那些说它在 JavaScript 中不好的评论,我知道。如果大多数人认为这是不好的做法,我问为什么首先允许它发生。