仅在}之前、一个或多个换行之后和程序输入的结尾被插入
也就是说你只能在一行、一个代码块和一段程序结束的地方省略分号。
也就是说你可以写如下代码
function square(x) { var n = +x return n * n }
function area(r) { r = +r return Math.PI*r*r }//error
仅在随后的输入标记不能解析时插入
也就是说分号插入是一种错误校正机制。看代码说话
a = b (f()) //能正确的解析为一条单独的语句 单价于下面这条语句 a = b(f())a = b f() //被解析为两条独立的语句 a = bf();//解析有误
所以你必须得注意下一条语句的开始,从而确定你是否能够合法的省略分号。
(、[、+、-、和/ 这五个字符开始的语句,那么最好前面不要省略分号。
举例说明一下哦
a = b ['r', 'g', 'b'].forEach(function (key) { console.log(key); });
a = b['r', 'g', 'b'].forEach(function (key) { console.log(key); });
所以(、[、+、-、和/ 这五个字符开始的语句,那么最好前面不要省略分号。
想省略分号,有经验的程序员会在该语句的后面跟一个声明语句,以保证解析器解析正确。如下所示
a = b var x//特意在此加了声明语句以保证a = b不会和(f())解析到一块儿 (f())
省略分号导致脚本连接问题
//file1.js (function () { //...... })()//file2.js (function () { //...... })()
上述两个文件连接时,就会被解析成如下
(function () { //...... })()(function () { //...... })()
所以省略分号不仅需要当心当前文件的下一个标记,而且还需要当心脚本连接后可能出现在语句之后的任一标记。
为避免解析器解析错误,你可以在每个文件前缀一个额外的分号以保护脚本免受粗心连接的影响。如果文件最开始的语句以上述5个脆弱字符开关,你就应该添加额外的分号前缀。
JavaScript语法限制产生式
JavaScript语法限制产生式:不允许在两个字符之间出现换行。
举例说明:
return {};
return; {} ;
自增自减运算的分号插入规则
a ++ b
a; ++b;
分号不会作为分隔符在for循环空语句的头部被自动插入
for (var i = 0,total=1 i < length i++) { total*=i; }
空循环体的while同样也需要显示的分号,否则也会导致解析错误
function mytest() { while (true) }
function mytest() { while (true) ; }
总结一下哦
1.仅在}标记之前、一行的结束和程序的结束处推导分号
2.仅在紧接着的标记不能被解析的时候推导分号
3.在以(、[、+、-、和/ 字符开头的语句前绝不能省略分号
4.当脚本连接的时候,在脚本之间显式的插入分号
5.在return、throw、break、continue、++或--的参数之前绝不能换行
6.分号不能作为for循环的头部或空语句的分隔符而被推导出
本文向大家介绍Javascript 事件冒泡机制详细介绍,包括了Javascript 事件冒泡机制详细介绍的使用技巧和注意事项,需要的朋友参考一下 1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作。 浏览器的事件表示的是某些事情发生的信号。事件的阐述不是本文的重点,尚未了解的朋友,可以访问W3school教程 进行了
本文向大家介绍SQLite中的WAL机制详细介绍,包括了SQLite中的WAL机制详细介绍的使用技巧和注意事项,需要的朋友参考一下 一、什么是WAL? WAL的全称是Write Ahead Logging,它是很多数据库中用于实现原子事务的一种机制,SQLite在3.7.0版本引入了该特性。 二、WAL如何工作? 在引入WAL机制之前,SQLite使用rollback journal机制实现原子事
本文向大家介绍浅析Javascript的自动分号插入(ASI)机制,包括了浅析Javascript的自动分号插入(ASI)机制的使用技巧和注意事项,需要的朋友参考一下 前言 相信从事过C#和Java的大家都知道分号是用作断句(EOS,end of statement)的,而且必须加分号,否则编译就不通过了。但JavaScript由于存在ASI机制,因此允许我们省略分号。ASI机制不是说在解析过程中
本文向大家介绍JavaScript中的console.log()函数详细介绍,包括了JavaScript中的console.log()函数详细介绍的使用技巧和注意事项,需要的朋友参考一下 对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻断JavaScript程序的执行,从而造成副作用;而console.log
本文向大家介绍JavaScript中的console.time()函数详细介绍,包括了JavaScript中的console.time()函数详细介绍的使用技巧和注意事项,需要的朋友参考一下 如果需要在Web调试过程中知道代码执行的时间,那么可以通过在JavaScript代码中添加console.time()语句和console.timeEnd()语句来对程序的执行进行计时。以下面这个耗时较长的f
本文向大家介绍JavaScript中的console.group()函数详细介绍,包括了JavaScript中的console.group()函数详细介绍的使用技巧和注意事项,需要的朋友参考一下 在使用console.log()或者其它日志级别的控制台输出功能时,日志输出是没有层级关系的。当程序中日志输出较多时,这一局限性将带来不小的麻烦。为了解决这一问题,可以使用console.group()。
本文向大家介绍JavaScript中的值类型详细介绍,包括了JavaScript中的值类型详细介绍的使用技巧和注意事项,需要的朋友参考一下 计算机程序的实质很大程度上可以说是机器对各种信息(值)的操作与读写。在JavaScript中,存在多种类型的值,这些值分成两大类:Primitive(基本类型)和Object(对象)。 Primitive JavaScript中Primitive有5种类型:
本文向大家介绍Javascript中作用域的详细介绍,包括了Javascript中作用域的详细介绍的使用技巧和注意事项,需要的朋友参考一下 1、编译原理 在传统编译语言的流程中,程序中的一段代码执行前会经历三个步骤。统称为“编译”。 词法分析 将代码字符串分解成有意义的代码块,这些代码块称为词法单元。例如:在js中,var a = 2;。这段程序通常被拆分为以下词法单元。var、a、2、;。至