问题标签 [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.
javascript - JavaScript 的自动分号插入 (ASI) 的规则是什么?
好吧,首先我可能应该问这是否取决于浏览器。
我已经读过,如果找到了一个无效的标记,但代码部分在该无效标记之前是有效的,如果它前面有一个换行符,则在该标记之前插入一个分号。
但是,由分号插入引起的错误引用的常见示例是:
..这似乎不遵循这个规则,因为 _a 将是一个有效的令牌。
另一方面,分解调用链按预期工作:
有没有人对规则有更深入的描述?
javascript - 我听说 Javascript 会插入“;” 自动,这可能会导致问题
我也听说 Go 也插入了它们,但他们采用了不同的方法
Javascript 在解释时如何插入分号?
javascript - 将分号置于 asi 模式中的括号前
我正在使用 JSHint 对我的 JavaScript 进行 linting,并启用了此选项
避免在我的代码中使用分号。
但是我必须用括号开始我的新行,所以我必须在那个开始之前放一个分号
JSHint 给我两个错误:
- ';' 后缺少空格
- 如果我在 ';' 后面加一个空格 我得到:预期 '(' 有不同的标识
我注意到这样 JSHint 很高兴
但我认为不是一个好的解决方案。
有没有办法在不关闭 JSHint 或white选项的情况下解决这个问题?
javascript - Resharper 可以在我的 javascript 函数声明中添加分号吗?
使用 Visual Studio 2012、Resharper 7.0.1
如果我正在编辑 JavaScript,并输入以下内容(| = 光标位置):
.. Resharper 将为我添加右括号:
...但我希望它之后也添加一个分号:
javascript - 自动分号插入和返回语句
您可能知道,ECMAscript 试图变得聪明,如果您没有明确编写分号,它会自动插入分号。简单的例子
仍将按预期工作。但是,如果你依赖它,有一些警告。如果我们像这样重写那个函数
..那个函数现在会返回undefined
,因为解释器会在语句之后插入分号return
(这就是为什么你总是应该在语句的同一行加上大括号的原因)。
然而,知道了这一切,我现在想知道像下面这样的语句在浏览器和版本之间有多安全return
return statement
我只是在生产环境中写了一个类似的。仅仅因为我知道 ECMAscript 对分号插入不太聪明的“问题”,我现在想知道该代码是否 100% 有效。在我对 FF/Chrome/IE(最新版本)的第一次测试中,这似乎完全没问题,但真的如此吗?
如果除了该行中的语句之外还有其他内容,自动分号插入是否会“唤醒” ?return
任何人都可以提供有关此的实现级别的详细信息吗?
javascript - 在 JavaScript 中自动插入分号而不解析
我正在编写一个 JavaScript 预处理器,它会在必要的地方自动插入分号。不要问为什么。
现在我知道解决这个问题的一般方法是编写一个 JavaScript 解析器,并根据规范中的规则在必要时添加分号。但是我不想这样做,原因如下:
- 我不想写一个成熟的解析器。
- 我想保留评论和空白。
我已经(正确地)使用简单的扫描仪实现了自动分号插入的第二条和第三条规则。
然而,第一条规则被证明是实施起来更具挑战性。所以我有三个问题:
- 是否可以使用带有前瞻和后视的简单扫描仪来实现第一条规则?
- 如果可能,那么有人已经做到了吗?
- 如果不是那么我应该如何解决这个问题?
为了完整起见,这里是三个规则:
当从左到右解析程序时,遇到任何语法生成都不允许的标记(称为违规标记)时,如果出现以下一项或多项,则在违规标记之前自动插入分号条件为真:
违规标记与前一个标记至少有一个LineTerminator分开。
有问题的令牌是}。
当程序从左到右解析时,遇到输入令牌流的结尾,并且解析器无法将输入令牌流解析为单个完整的 ECMAScript Program,则在末尾自动插入分号输入流。
当程序从左到右解析时,遇到某个语法产生式允许的记号,但产生式是受限制的产生式,并且该记号将是紧跟注释之后的终端或非终端的第一个记号"[no LineTerminator here]" 在受限产生式中(因此这样的记号被称为受限记号),并且受限记号与前一个记号至少有一个LineTerminator分隔,然后在受限记号前自动插入分号.
但是,前面的规则还有一个额外的覆盖条件:如果分号随后将被解析为空语句,或者如果该分号将成为for语句标题中的两个分号之一(部分12.6.3 )。
javascript - [] 之前没有分号导致 JavaScript 出错
当这段代码导致我今天非常惊讶
显然 JavaScript 的“自动分号插入”在这里没有按预期工作。但为什么?
我知道您可能会建议在;
任何地方使用以避免类似的情况,但问题不在于是否更好使用;
。我很想知道这里到底发生了什么?
javascript - JS中的自动分号插入会影响第一个{在新行上的for循环吗?
JS 自动分号插入是否会for(...)
像我在以下示例中放置的那样在末尾放置一个分号,或者使用 for 循环将括号分成新行是否安全?
我发现很多信息说明了什么受到影响,但没有具体到我的问题,这让我相信它可能不会受到影响,但我想找到一个具体的答案。
就个人而言,我不喜欢用这样的括号换行,但问题已经提出;)
javascript - 括号会阻止分号插入吗?
假设我想设置一堆等于 null 的变量(并且不想使用数组/循环结构),或者我只想跨多行编写一个大型布尔表达式。在这种情况下,未闭合的括号会阻止分号插入吗?例如
或者
这与使用&&
or ||
or=
对换行符分组表达式有何比较?即,这也总是有效吗?
我正在寻找所有浏览器(包括 IE6+)中最标准的方式。
javascript - 为什么有些编程语言允许自动包含分号?
如果忘记分号,C++ 等语言将无法使用,但 JavaScript 等其他语言会自动为您包含它们。
我从这篇文章中知道您是否建议在 JavaScript 中的每个语句后使用分号?,建议使用分号,并且在某些情况下会产生不必要的歧义(例如在不使用大括号时在 C++ 中悬挂 else)。
在某个时间点,必须做出让它们可选的决定(例如,当 JavaScript 的创建者有意识地选择使其可选时)。
我想知道为什么做出这个决定,以及它对这些语言的用户有什么好处。
背景:我是一名新手程序员,最近才开始学习 JavaScript。
编辑:对于那些说它在 JavaScript 中不好的评论,我知道。如果大多数人认为这是不好的做法,我问为什么首先允许它发生。