资讯专栏INFORMATION COLUMN

JavaScript中分号自动插入

dadong / 2707人阅读

摘要:中分号自动插入转译自链接描述在中,分号自动插入机制允许在一行代码结尾省略分号。比如分号自动插入规则分号插入只是一个术语。如果在这些位置遇到换行了,分号将被插入。

JavaScript中分号自动插入

转译自:链接描述
在JavaScript中,分号自动插入机制允许在一行代码结尾省略分号。你应该养成一直书写分号的习惯,与此同时掌握JavaScript分号省略处理机制是十分重要的。因为这不仅有助于你去理解省略分号的代码,而且对于那些没有省略分号的代码也能有更深层次的理解。

背景:JavaScript语法

首先,我要介绍一些和本文剩余部分相关的语法现象,方便大家理解。

表达式VS语句

表达式:经计算后会有一个值。

 3 * Math.sqrt(x)
    i++
    obj.prop
    [ "a", "b", "c" ]
    { first: "Jane", last: "Doe" }
    function() {} // function expression

语句:程序是由一系列语句组成。

for(var i=0; i<3; i++) {
        console.log(i);
    }
    function twice(x) { // function declaration
        return 2 * x;
    }
    var foo = twice(21); // assignment

注意,赋值语句右边是一个表达式。
语句应该以分号结尾:在JavaScript中,任何语句都应该以分号结尾,但下面这些例外。、

循环语句:for,while(不是do while)

分支语句:if,switch,try

函数声明(不是函数表达式)
示例1:while VS do while

while(a > 0) {
        a--;
    } // no semicolon
    
    do {
        a--;
    } while(a > 0);

示例2:函数声明 VS 函数表达式

 function foo() {
    } // no semicolon
    
    var foo = function() {
    };

注意,当你在上述提及到的语句后面加了分号,浏览器不会提示你有语法错误,因为它被视作为一个空语句。

空语句。当一个分号多带带出现的时候,它代表一个空语句,什么也不会做。空语句可以出现在任何语句可以出现的地方。当一个语句是被需要的,但是又不需要这个语句完成什么功能的时候,空语句是非常有用的。在这种情况下,块代码也是允许的,不过一个空语句块要比一个分号要长。举个例子,西面两个语句是等价的:

 while(processNextItem() > 0);
 while(processNextItem() > 0) {}

下面的程序在语法上也是正确的:三个空语句。

;;;

表达式作为语句任何表达式都可以转换为语句,只需在表达式结尾加一个分号就可以了。比如:

 "hello world";
    a + b;
    sum(5, 3);
    a++;
分号自动插入规则(ASI)

分号插入只是一个术语。它并不意味着代码在解析的时候就真的被插入了分号。
相反,它只是一个很好的 用来解释当分号可有可无的情况下的 比喻说法。
规范:解析器把每一个新的记号当做当前语句的一部分,除非有一个分号来结束它。下面给出的示例代码,你也许会以为一个分号应该被插入,但实际上没有。下面例子阐明了忽略分号的危险。

NO ASI:

     a = b + c
    (d + e).print()

上述代码不会触发ASI,因为左括号可以跟在C后面作为函数调用。因此,上述代码被解释为:

a = b + c(d + e).print();

NO ASI:

 a = b
    /hi/g.exec(c).map(d);

没有分号插入,第二条语句不会被解释为正则表达式。上述代码等价于:

a = b / hi / g.exec(c).map(d);   

NO ASI:

 var foo = "bar"
    [ "red", "green" ].foreach(function(c) { console.log(c) })

没有分号被插入。相反,第二行代码开头被解释为字符串“bar”的下标索引。由于逗号运算符的存在,方括号的逗号能够被解释器解释。
NO ASI:
在很多浏览器中,下面的代码中的func被赋值为0,因为a++被解释为上一行的函数表达式的参数。

 var a = 0;
    var func = function(x) { return x }
    (a++)

规范的例外:在下面的例子中ASI机制被应用。
换行加上非法的记号符:如果遇到了换行,并且接下来一行的代码被添加在上面代码中不能组成合法的语句,此时分号会被插入。
举个例子:

    if (a < 0) a = 0
    console.log(a)

上述代码会触发ASI机制,被解释为下面的语句:

if (a < 0) a = 0;
console.log(a);

禁止的行结束符:下面的句法结构中在特定位置禁止换行。如果在这些位置遇到换行了,分号将被插入。在ECMAScript标准中称下述语法规则为限制生产( 英文为restricted productions,暂且直译)。

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

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

相关文章

  • 【知识点】Javascript分号规则

    摘要:花点时间搞清楚中的分号规则吧不管你喜欢结尾带分号或省略分号的模式分号允许的场景分号一般允许出现在大部分语句的末尾,比如等栗子仅有一个分号可以表示空语句在中合法,比如可解析为三个空语句空语句可用于辅助产生语法合法的解析结果,如如果没有末尾的 花点时间搞清楚JS中的分号规则吧~~~不管你喜欢结尾带分号或省略分号的模式 分号允许的场景 分号一般允许出现在大部分语句(statement)的末尾...

    kun_jian 评论0 收藏0
  • 细说 Javascript 拾遗篇(三) : 自动插入分号

    摘要:此时会自动插入分号,解析器将再次尝试。工作原理下面的代码没有分号,因此解析器将会自己判断在哪些地方插入分号。前置小括号在有前置小括号的情形时,解析器将不会自动插入分号。这不仅将保证代码整体的一致性,也将有效地避免解析器对代码行为的错误改变。 尽管 Javascript 有类似 C 的句法风格,但是它并不强制在代码中使用分号,所以分号可能被省略。Javascript 并不是一个缺少分号的...

    mushang 评论0 收藏0
  • JavaScript里的语句用分号结尾是个选项吗

    摘要:在以下的种情况是用回车或换行,是不会作自动插入分号来让语句作结尾。以下情况必用分号。但有例外,赋值时可以加分号是对的语法。 起因 这个文章一开始回覆于这篇回答中: javascript初级问题 也有之前的朋友写信来问,因为在读到我个人写的一本电子书: 从ES6开始的JavaScript学习生活,繁体,gitbook。我在写作风格里有说明,这本电子书中的范例都是使用不用分号(;)作为代码...

    stormzhang 评论0 收藏0
  • 重学前端学习笔记(二十九)--JavaScript要不要加分号

    摘要:一自动插入分号规则三条规则要有换行符,且下一个符号是不符合语法的,那么就尝试插入分号。有换行符,且语法中规定此处不能有换行符,那么就自动插入分号。源代码结束处,不能形成完整的脚本或者模块结构,那么就自动插入分号。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整...

    Sourcelink 评论0 收藏0

发表评论

0条评论

dadong

|高级讲师

TA的文章

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