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 相关文章推荐
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
Oct 01 Javascript
JavaScript 应用技巧集合[推荐]
Aug 30 Javascript
动态创建样式表在各浏览器中的差异测试代码
Sep 13 Javascript
JavaScript判断textarea值是否为空并给出相应提示
Sep 04 Javascript
Jquery实现动态切换图片的方法
May 18 Javascript
jquery实现左右滑动菜单效果代码
Aug 27 Javascript
node.js中module.exports与exports用法上的区别
Sep 02 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
Apr 18 Javascript
快速解决vue在ios端下点击响应延时的问题
Aug 27 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
Sep 12 Javascript
layui内置模块layim发送图片添加加载动画的方法
Sep 23 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
Jul 22 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
JavaScript中的继承方式详解
Feb 11 #Javascript
You might like
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
12岁生日感言
2014/01/21 职场文书
《愚公移山》教学反思
2014/02/20 职场文书
违反交通法规检讨书
2014/09/10 职场文书
助学贷款贫困证明
2014/09/23 职场文书
学生自我评语
2015/01/04 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
公司保洁员管理制度
2015/08/04 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB
科普 | 业余无线电知识-波段篇
2022/02/18 无线电
mysql查询结果实现多列拼接查询
2022/04/03 MySQL