美文网首页
JS自动分号插入 ASI

JS自动分号插入 ASI

作者: amnsss | 来源:发表于2017-02-18 15:25 被阅读148次

自动分号插入 (ASI),被认为是 JavaScript 中较为有争议的特征。

ASI 的规则是相对简单的:正如 Isaac Schlueter 曾就经描述的那样,一个 \n 字符总是一个语句的结尾(自动加上 ;),除非下面之一为真,则不加:

  • 该语句有一个没有闭合的括号,数组字面量或对象字面量或其他某种方式,不是有效结束一个语句的方式。(比如,以 ., 结尾)
  • 该行是 --++(在这种情况下它将减量/增量的下一个标记)
  • 它是个 for()while()doif()else,并且没有 {
  • 下一行以 [(+*/-,. 或一些其它在单个表达式中两个标记之间的二元操作符。

在 ASI 的争论中,一般有两大思想流派。第一个是,我们应该忽略 ASI 的存在,总是手动添加分号。理由是比起记住什么时候是否需要分号,把它们加进来更容易一些,并因此降低了引入错误的可能性。

然而,对使用分号的人而言,ASI 机制有时会很棘手。例如:

return
{
    name: "ESLint"
};

这个看起来像是个return语句返回一个对象文本。然而,JavaScript 引擎将代码解释成:

return;
{
    name: "ESLint";
}

事实上,一个分号插入到 return 语句之后,导致(块中的标签文本)下面的代码不可达。ESLint semino-unreachable 规则将会避免你的代码出现这种情况。

争论的另一派别说由于分号的自动插入,它们是可选的,不需要手动添加。然而,对不使用分号的人而言,ASI 机制有时也会很棘手。例如,考虑以下代码:

var globalCounter = { }

(function () {
    var n = 0
    globalCounter.increment = function () {
        return ++n
    }
})()

在这个例子中,分号不会被插入到第一行末尾,导致一个运行时错误(因为一个空的对象被调用,犹如它是个函数)。ESLint no-unexpected-multiline 规则将会避免你的代码出现这种情况。

因此,最好是知道 ASI 什么时候插入分号,什么时候不插入分号,让 ESLint 帮你的代码避免这些潜在的意外情况。

相关文章

  • javaScript 基础

    初学JavaScript基础 ASI 自动分号插入(ASI)的目标是使分号对行结束来来说是可选的。引入自动分号插入...

  • JS自动分号插入 ASI

    自动分号插入 (ASI),被认为是 JavaScript 中较为有争议的特征。 ASI 的规则是相对简单的:正如 ...

  • javascript ASI(automatic semicol

    javascript ASI 就是指的是javascript的自动插入分号机制,就是说有的人写js的时候,其实是不...

  • JS-为什么说添加分号是一个好习惯

    JavaScript在解析代码的时候并不是每行都添加分号的,自动分号插入(ASI)是JavaScript解析器添加...

  • ASI(自动分号插入机制)和前置分号

    基本规则 以换行为基础,解析器会尽量将新行并入当前行,仅当符合ASI规则时才会将新行视为独立的语句。 ASI规则 ...

  • JavaScript自动分号补齐的坑

    自动分号补齐(auto semicolon insertion,简称ASI) 在JavaScript中,行尾的分号...

  • 重学前端——语法

    分号 1. 自动插入分号规则(1)有换行符,且下一个符号是不符合语法的,自动插入分号;(2)有换行符,且语法中规定...

  • 06丨到底要不要写分号呢?

    自动插入分号规则 自动插入分号规则其实独立于所有的语法产生式定义,它的规则说起来非常简单,只有三条。 要有换行符,...

  • Airbnb规范

    不使用分号 使用分号 为什么? 当 JavaScript 遇到没有分号的换行符时,它使用一组称为自动分号插入的规则...

  • [ECMAScript] 自动分号插入机制

    1. 插入分号 ECMAScript中,大部分声明和语句,都必须以分号结尾,原则上,必须书写这些分号。 但是为了方...

网友评论

      本文标题:JS自动分号插入 ASI

      本文链接:https://www.haomeiwen.com/subject/kyorwttx.html