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,临时直译)。