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 相关文章推荐
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
May 25 Javascript
Javascript 实现TreeView CheckBox全选效果
Jan 11 Javascript
浅析javascript中function 的 length 属性
May 27 Javascript
javascript实现单击和双击并存的方法
Dec 13 Javascript
jQuery实现点击水纹波动动画
Apr 10 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
May 12 Javascript
JS轮播图中缓动函数的封装
Nov 25 Javascript
浅谈angular4实际项目搭建总结
Dec 01 Javascript
使用vue实现多规格选择实例(SKU)
Aug 23 Javascript
js实现漂亮的星空背景
Nov 01 Javascript
vue.js实现简单的计算器功能
Feb 22 Javascript
vue绑定class的三种方法
Dec 24 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 无限分类的树类代码
2009/12/03 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
node thread.sleep实现示例
2018/06/20 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
简单讲解Python中的闭包
2015/08/11 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
波兰补充商店:Muscle Power
2018/10/29 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
2014年教师业务学习材料
2014/05/12 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书