资讯专栏INFORMATION COLUMN

JS分号自动插入的ASI机制

sunny5541 / 286人阅读

摘要:规范理论标准定义了自动分号插入规则,包括以下三个基本规则加两个前置条件前置条件如果插入分号后解析结果是空语句,那么不会自动插入分号。

规范理论

es5 标准定义了自动分号插入规则,包括以下三个基本规则加两个前置条件:

前置条件

1、如果插入分号后解析结果是空语句,那么不会自动插入分号。

例子:(空语句,else 前不加分好)

if (a > b)
else c = d

2、如果插入分号后它成为 for 语句头部的两个分号之一,那么不会自动插入分号。

例子:(不会加分号)

for (a; b
)

基本规则

左到右解析程序,当遇到一个不符合任何文法产生式的 token(叫做 违规 token(offending token)),那么只要满足下面条件之一就在违规 token 前面自动插入分号。

 1、至少一个 LineTerminator 分割了违规 token 和前一个 token。

 2、违规 token 是 }。

例子:(1、2不符合任何产生式,并且之间存在 LineTerminator,因此在违规 token 2前加了分好,2和}则是因为违规 token 是 }所以加了分号)

{ 1
2 } 3

{ 1
;2 ;} 3;

左到右解析程序,tokens 输入流已经结束,当解析器无法将输入 token 流解析成单个完整 ECMAScript 程序 ,那么就在输入流的结束位置自动插入分号。

对于受限产生式,也就是下面的5个,我们把产生式 [no LineTerminator here]后面的 token 叫做受限 token,如果在 token 和 受限 token 间存在了至少一个 LineTerminator,那么会在受限 token 前自动加上 token。

受限的产生式只限如下5个:

PostfixExpression :

LeftHandSideExpression [no LineTerminator here] ++ LeftHandSideExpression [no LineTerminator here] --

ContinueStatement :

continue [no LineTerminator here] Identifier;

BreakStatement :

break [no LineTerminator here] Identifier;

ReturnStatement :

return [no LineTerminator here] Expression;

ThrowStatement : throw [no LineTerminator here] Expression;

归纳

避免 ASI 带来的问题

 1、后缀运算符 ++ 或 -- 和它的操作数应该出现在同一行。

 2、return 或 throw 语句的表达式开始位置应该和 return 或 throw token 同一行。

 3、break 或 continue 语句的标示符应该和 break 或 continue token 同一行。

何时加分号

无分号党想要不加分号,那么就需要知道什么时候应该要加分号。网上的一篇文章归纳了 NO ASI 并且会出现错误的几种情况,在这几种情况下我们是要加分号的。下面是对应的描述:

在以 ([/+- 开头的语句前加分号(由于正常写法均不会出现以 .,*% 作为语句开头,因此只需记住前面5个即可,你看能懒则懒哦)

不过这里只考虑了换行的情况,其实 ASI 还存在不换行的情况,这就要根据标准里的三条规则行事了!

知道了这点,其实我们就可以省略大部分的分号了。但是也不强求,因为这还是要根据个人习惯以及团队风格走的。

小补充

为什么自执行函数前要加分号?

主要是应对代码合并压缩时,由于缺少分号;带来的错误。知道了上面的规则,在 ( 开头的行前加分号就可以避免错误了。

原文地址:https://www.jb51.net/article/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96448.html

相关文章

  • JavaScript ASI 机制详解

    摘要:最近在清理的未读列表,看到了才知道了的,一种自动插入分号的机制。这种行为被叫做自动插入分号,简称。不过在省略分号的风格中,这种解析特性会导致一些意外情况。规则标准定义的包括三条规则和两条例外。规则一情况三就是为量身定做的。 TL;DR 最近在清理 Pocket 的未读列表,看到了 An Open Letter to JavaScript Leaders Regarding Semico...

    frontoldman 评论0 收藏0
  • JavaScript中分号自动插入

    摘要:中分号自动插入转译自链接描述在中,分号自动插入机制允许在一行代码结尾省略分号。比如分号自动插入规则分号插入只是一个术语。如果在这些位置遇到换行了,分号将被插入。 JavaScript中分号自动插入 转译自:链接描述在JavaScript中,分号自动插入机制允许在一行代码结尾省略分号。你应该养成一直书写分号的习惯,与此同时掌握JavaScript分号省略处理机制是十分重要的。因为这不仅有...

    dadong 评论0 收藏0
  • 备胎自我修养——趣谈 JavaScript 中 ASI (Automatic Semicolon

    摘要:行结束符之后的符号有二义性,使得该符号与上条语句能够无缝对接,不导致语法错误。然而在中,有几种特殊语句是不允许行结束符存在的。如果语句中有行结束符,会优先认为行结束符表示的是语句的结束,这在标准中称为限制产生式。 showImg(https://segmentfault.com/img/bVmyZB); 什么是 ASI ? 自动分号插入 (automatic semicolon i...

    _ipo 评论0 收藏0
  • javascript代码风格指北

    摘要:这段代码工作正常,尽管没有用分号在某些场景下是很管用的,特别是,有时候可以帮助减少代码错误。比如不好的写法尽管这段代码能正常工作,但代码中我们应尽量避免使用。前言 在我们平时工作中写代码是最频繁的事情了,但我们的代码真的好看吗? 预计本文阅读时间(10分钟) 正文 1.1--语句结尾 我们来看一段代码 //合法的代码 var name = Dreams; function sayName(...

    546669204 评论0 收藏0
  • JS语句后加不加分号

    摘要:问题前一阵子猛然想到一个问题有分号自动补全机制在写时我是习惯性在语句后面加上分号在块语句后面不加分号。关于加不加分号的问题知乎上一些回答这个问题的大佬普遍意见是喜欢就好。 问题 前一阵子猛然想到一个问题,JS有分号自动补全(ASI)机制,在写JS时我是习惯性在语句后面加上分号,在块语句后面不加分号。那么如果没有加分号的话,在什么情况下会出现问题?在JS语句后到底是应该加分号还是不加分号...

    OnlyLing 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<