JavaScript语法:到底要不要写分号呢?
自动插入分号规则
自动插入分号规则其实独立于所有的语法产生式定义,有三条件定义:
- 要有换行符,且下一个符号是不符合语法的,那么就尝试插入分号。
- 有换行符,且语法中规定此处不能有换行符,那么就自动插入分号。
-
源代码结束处,不能形成完整的脚本或者模块结构,那么就自动插入分号。
// 命中第一条规则 let a = 1/*此处要加分号*/ void function(a){ console.log(a); }(a);
// 命中第二条规则 var a = 1, b = 1, c = 1; a/*此处要加分号*/ ++ b/*此处要加分号*/ ++ c
//这个两个function调用写法被称作IFEE(立即执行的函数表达式), // JavaScript会认为函数返回的可能还是个函数,所以函数后边在跟函数调用就是合理的。 // 因此这里不会自动加分号。 (function(a){ console.log(a); })() (function(a){ console.log(a); })()
//根据JavaScript自动插入分号规则,带换行符的注释也被认为是有换行符,而恰好的是, // return也有[no LineTerminator here]规则的要求。所以return这里会自动加分号。 function f(){ return/* This is a return value. */1; } f();
no LineTerminator here 规则
no LineTerminator here规则表示它所在的结构中的这一位置不能插入换行符。
// 带标签的continue语句,不能在continue后插入换行。 outer:for(var j = 0; j
// break与continue一样,不能在break后插入换行。 outer:for(var j = 0; j
// return 和后自增、后自减运算符 不能插入换行符 function f(){ return /*no LineTerminator here*/1; } i/*no LineTerminator here*/++ i/*no LineTerminator here*/--
// throw 和 throw 之间不能插入换行符 throw/*no LineTerminator here*/new ("error")
// 凡是async关键字,后面不能插入换行符 async/*no LineTerminator here*/function f(){ } const f = async/*no LineTerminator here*/x => x*x
// 箭头函数前,不能插入换行符 const f = x/*no LineTerminator here*/=> x*x
// yield之后,不能插入换行符 function *g(){ var i = 0; while(true) yield/*no LineTerminator here*/i++; }
此文章为7月Day11学习笔记,内容来源于极客时间《重学前端》,日拱一卒,每天进步一点点💪💪
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net