JavaScript中的分号插入机制详细介绍


Posted in Javascript onFebruary 11, 2015

仅在}之前、一个或多个换行之后和程序输入的结尾被插入

也就是说你只能在一行、一个代码块和一段程序结束的地方省略分号。

也就是说你可以写如下代码

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);

});

因为第二句语句是以[开始的,所以解析器不会在第一条语句后自动插入分号,这样就解析成了如上所示,上面的式子解析时b['b'].forEach难道不是错的吗?

所以(、[、+、-、和/  这五个字符开始的语句,那么最好前面不要省略分号。

想省略分号,有经验的程序员会在该语句的后面跟一个声明语句,以保证解析器解析正确。如下所示

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 相关文章推荐
js几个不错的函数 $$()
Oct 09 Javascript
jquery入门必备的基本认识及实例(整理)
Jun 24 Javascript
JS小功能(列表页面隔行变色)简单实现
Nov 28 Javascript
jquery $.trim()方法使用介绍
May 21 Javascript
JS网页在线获取鼠标坐标值的方法
Feb 28 Javascript
js+html5实现canvas绘制圆形图案的方法
Jun 05 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
Jun 19 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
Feb 20 Javascript
Vue.use源码分析
Apr 22 Javascript
highcharts 在angular中的使用示例代码
Sep 20 Javascript
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 Vue.js
Javascript核心读书有感之语句
Feb 11 #Javascript
JavaScript数据结构和算法之二叉树详解
Feb 11 #Javascript
JavaScript中的函数模式详解
Feb 11 #Javascript
Javascript核心读书有感之表达式和运算符
Feb 11 #Javascript
JavaScript数据结构和算法之图和图算法
Feb 11 #Javascript
Javascript核心读书有感之类型、值和变量
Feb 11 #Javascript
JavaScript中的继承方式详解
Feb 11 #Javascript
You might like
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
2018/12/12 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
python抓取网页内容示例分享
2014/02/24 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python调用百度语音REST API
2018/08/30 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
Windows下Anaconda安装、换源与更新的方法
2020/04/17 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
项目开发计划书
2014/01/09 职场文书
采购助理岗位职责
2014/02/16 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
会计岗位职责模板
2014/03/12 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
施工现场安全管理制度
2015/08/05 职场文书
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android