JavaScript中分号自动插进去

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中,任何语句都应当以分号末端,但下面这些破例。、

  1. 轮回语句:for,while(不是do while)

  2. 分支语句:if,switch,try

  3. 函数声明(不是函数表达式)
    示例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://segmentfault.com/a/1190000009492525
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞